【问题标题】:JAXB unmarshal XML with a parent element in a child elementJAXB 使用子元素中的父元素解组 XML
【发布时间】:2016-05-17 11:26:18
【问题描述】:

我已经四处寻找和搜索,但找不到我的问题的答案。我有一个具有以下结构的 XML 文件:

<!DOCTYPE persons [
    <!ELEMENT lastname (#PCDATA)>
    <!ELEMENT firstname (#PCDATA)>
    <!ELEMENT residence (#PCDATA)>
    <!ELEMENT children (person*)>
    <!ELEMENT person (firstname, (lastname?), (children?), (residence?))>
    <!ELEMENT persons (person+)>
    <!ATTLIST person id ID #REQUIRED>
    <!ATTLIST person friends IDREFS #IMPLIED>
    <!ATTLIST persons file CDATA #IMPLIED>
    ]>

<persons file="this">
    <person id="p-1">
        <firstname>Homer</firstname>
        <lastname>Simpson</lastname>
        <residence>Springfield</residence>
        <children>
            <person id="p-3">
                <firstname>Bart</firstname>
                <residence>Springfield</residence>
            </person>
        </children>
    </person>
    <person id="p-2" friends="p-1">
        <firstname>Ned</firstname>
        <lastname>Flanders</lastname>
        <residence>Springfield</residence>
    </person>
</persons>

我的 Java 文件如下:

Persons.java

@XmlRootElement(name="persons")
public class Persons {

    @XmlAttribute(name="file")  
    private String file;
    @XmlElement(name="person")
    private List<Person> persons;

    /* setters and getters */
}

Person.java

public class Person {

    @XmlAttribute(name="id")
    private String id;
    @XmlAttribute(name="friends")
    private String friends;
    private String firstname;
    private String lastname;
    private String residence;
    private List<Children> children;

    /* getters and setters */
}

Children.java

public class Children {

    private List<Person> persons;

    /* getters and setters */
}

注意:我在对象变量上使用了注释,因为我不想写下 getter 和 setter。我知道,否则@XmlAccessorType(XmlAccessType.FIELD) 是必要的。

所以&lt;children&gt; 实际上可以拥有一个或多个&lt;person&gt; 作为孩子。 我想我对不同的列表感到困惑。 当我通过对每个人使用简单的System.out.println() 命令解组给定的 XML 文件来简单地测试它时,我看到每个元素和属性都具有正确的值,但 person.getChildren() 总是返回 null。我做错了什么?

【问题讨论】:

  • 我正在努力解决同样的问题。真的有必要为每个嵌套元素创建一个类吗?有没有办法导航到子元素?

标签: java xml jaxb unmarshalling


【解决方案1】:

在您的 Children 课程中,您忘记添加

@XmlElement(name="person")

到儿童班内的人员名单。所以它应该是这样的:

public class Children {

    private List<Person> persons;

    public List<Person> getPersons() {
        return persons;
    }

    @XmlElement(name="person") // MISSING ANNOTATION
    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }
}

添加后我的输出是:

Persons = [
    file: this, 
    persons: [
        Person = [
            id=p-1, 
            freinds=null, 
            firstName=Homer, 
            lastName=Simpson, 
            residence=Springfield, 
            children=[
                Children = [
                    persons=[
                        Person = [
                            id=p-3, 
                            freinds=null, 
                            firstName=Bart, 
                            lastName=null, 
                            residence=Springfield, 
                            children=null
                        ]
                    ]
                ]
            ]
        ], 
        Person = [
            id=p-2, 
            freinds=p-1, 
            firstName=Ned, 
            lastName=Flanders, 
            residence=Springfield, 
            children=null
        ]
    ]
]

【讨论】:

  • 非常感谢!如果我可以问一下,您是如何获得该特定输出的?
  • 我自己解析了一下。我已将 tostring 添加到所有类,但在从控制台复制输出后手动添加了折叠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多