2012-07-10 149 views
2

我无法查找元素的查找属性值。我的XML是使用XStream读取元素属性值

<Person> 
      <BirthDate>2008-01-04</BirthDate> 
      <FirstName>Affo</FirstName> 
      <Gender tc="200">Male</Gender> 
      <LastName></LastName> 
      <Occupation>false</Occupation> 
      <Age>4</Age> 
</Person> 

我对<Gender tc="200">Male</Gender>感兴趣。我的POJO看起来是这样的:

private String FirstName; 
    private String LastName; 
    private String Occupation; 
    @XStreamAsAttribute 
    @XStreamAlias("tc") 
    private String genderTC; 
    private String Gender; 
    private String birthDate; 
    private int age; 

从XML是

  XStream stream = new XStream(new DomDriver()); 
     stream.processAnnotations(PersonType.class); 
     PersonType person = (PersonType) stream.fromXML(file); 

     System.out.println(person.getFirstName()); 
     System.out.println(person.getGenderTC()); 
     System.out.println(person.getGender()); 

这里person.getGenderTC()我得到空。有趣的是,当我逆转的过程和产生使用相同PersonType POJO的XML,我得到了下面的XML:

<Person tc="111"> 
    <FirstName>Himanshu</FirstName> 
    <Gender>M</Gender> 
    <Age>28</Age> 
</Person> 
+0

退房节 “将对象映射到简单的内容”:HTTP ://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html – 2012-07-10 17:34:15

+0

@BlaiseDoughan但是我又一次需要创建一个单独的类来获取内部属性。对? – 2012-07-10 17:43:42

+0

是的,如果您对使用EclipseLink MOXy感兴趣,我可以告诉您如何在不引入单独课程的情况下关闭它。 – 2012-07-10 17:50:34

回答

3

@BlaiseDoughan很棒,我感谢您的支持。您能否告诉我如何在不使用jaxb.properties的情况下将EclipseLink MOXy与我的项目 集成?什么是图书馆/ JARs包括? 在我知道EclipseLink JAXB(MOXy)实现获得 属性之间。我唯一的预感是jaxb.properties文件。

下面是你如何使用莫西的@XmlPath注释做你正在寻找的映射:

package forum11417620; 

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="Person") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Person { 

    @XmlElement(name="FirstName") 
    private String firstName; 

    @XmlElement(name="LastName") 
    private String lastName; 

    @XmlElement(name="Occupation") 
    private String occupation; 

    @XmlPath("Gender/@tc") 
    private String genderTC; 

    @XmlPath("Gender/text()") 
    private String gender; 

    @XmlElement(name="BirthDate") 
    private String birthDate; 

    @XmlElement(name="Age") 
    private int age; 

} 

演示

下面是一个例子如何在没有的情况下引导MOXy 文件。

package forum11417620; 

import java.io.File; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Person.class}, null); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11417620/input.xml"); 
     Person person = (Person) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(person, System.out); 
    } 

} 

input.xml中/输出

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <FirstName>Affo</FirstName> 
    <LastName></LastName> 
    <Occupation>false</Occupation> 
    <Gender tc="200">Male</Gender> 
    <BirthDate>2008-01-04</BirthDate> 
    <Age>4</Age> 
</Person> 

必需二进制(从http://www.eclipse.org/eclipselink/downloads/

选项#1 - 的EclipseLink JAR(从安装邮编)

  • eclipselink。罐子

选项#2 - MOXY束(从OSGi软件包邮编)

  • org.eclipse.persistence.moxy.jar
  • org.eclipse.persistence.core.jar
  • org.eclipse.persistence.asm.jar

Maven的

我有例如pom.xml文件上的Git枢纽作为从我的博客一些例子部分:

+0

感谢您的回复。我能够完美地运行它。我发现Eclipse Link也支持JPA。最终,我使用Hibernate将此POJO保存到数据库中。你可以请参考相同的教程吗? – 2012-07-11 00:56:13

+0

@HimanshuYadav - 我有以下JPA相关教程:http://blog.bdoughan.com/search/label/JPA。我会建议使用标准的JPA API,因为这将允许您在日后根据需要交换JPA提供程序。 – 2012-07-11 17:11:29

2

当你拥有了它,这样的代码:

@XStreamAsAttribute 
@XStreamAlias("tc") 
private String genderTC; 

期待的属性tc到位于XML的附件Person节点上。

我认为您需要定义第二个pojo类型来反序列化Gender数据,包括genderTC属性以及Gender元素。

+0

是吗?我有成千上万的元素只有一个属性。有没有其他的方式来做到这一点,使用转换器或XPath的东西。 – 2012-07-10 16:43:35

+0

ToAttributedValueConverter是一个可能的解决方案,根据这个问题:http://stackoverflow.com/questions/16460810/how-to-read-list-elements-with-attribute-via-xstream(虽然它确实需要每个克里斯儿童POJO '评论)。尽管为了最小化影响,您可以将孩子的POJO作为Person类的内部类。 – 2015-04-08 12:28:49