java - JAXB 使用子元素中的父元素解码 XML

标签 java xml jaxb unmarshalling

我已经查看并用谷歌搜索,但找不到我的问题的答案。我有一个具有以下结构的 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)是必要的。

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

最佳答案

在您的 Children 类(class)中,您忘记添加

@XmlElement(name="person")

到 child 类(class)内的人员列表。所以它应该看起来像这样:

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

关于java - JAXB 使用子元素中的父元素解码 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37274774/

相关文章:

java - NodeEntity 无法转换为 graphdb.Node

java - Android 中的 GridView 中未触发 OnItemClick 事件

xml - XSD 架构命名空间问题 -- cvc-complex-type.2.4.a

xml - 从两个 xml 文件在 XSLT 中排序

java - 是否可以使用 Moxy 将 JSON 对象映射到字符串?

java - JAXB - 如何使用 MOXy XPath 提取属性值?

java - 从 Spring 休息 Controller 获取 JSON

java - Hadoop setMapperClass和SetReducerClass无法正常工作?

xml - 是否有用于 Delphi 和 Free Pascal 的 SAX 解析器?

xml - 使用 Java 从 URL 下载 XML/RDF 文件