使用XStream读取元素属性值

时间:2012-07-10 16:19:15

标签: java xml xstream

我无法查找元素的属性值。我的XML是

<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>

2 个答案:

答案 0 :(得分:3)

  

@BlaiseDoughan这很棒,感谢您的支持。你能   请告诉我如何将EclipseLink MOXy与我的项目集成   不使用jaxb.properties?要包含哪些库/ JAR?   在我之间我了解EclipseLink JAXB(MOXy)实现   属性。我唯一的预感是jaxb.properties文件。

<强>人

以下是如何使用MOXy的@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;

}

<强>演示

下面是一个如何在没有JAXBContext文件的情况下引导MOXy jaxb.properties的示例。

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(来自Installer Zip)

  • eclipselink.jar

选项#2 - MOXy包(来自OSGi Bundles Zip)

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

的Maven

我在Git Hub上有一些示例pom.xml文件,作为我博客的一些示例的一部分:

答案 1 :(得分:2)

如你所知,这段代码:

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

期望属性tc位于XML的封闭Person节点上。

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