java - 如何使用 JAXB 在 Java 中解析这个 XML?

标签 java xml jaxb

我有以下 XML,没有 XSD 或模式,我想使用 JAXB 解析为 java 对象,因为我听说它比 SAX 更好。有没有办法通过注释或更好的方法来实现这一点?它是否使我只需要一个 FosterHome 类(class)?我无法找到如何做到这一点,任何帮助都非常感谢。

我最初想开设 FosterHome、Family 和 Child 类(class)。使用 JAXB,是否不再需要 3 个类?由于 ChildID 出现在两个不同的区域,我不确定如何处理。

<?xml version="1.0" encoding="UTF-8"?>
<FosterHome>
    <Orphanage>Happy Days Daycare</Orphanage>
    <Location>Apple Street</Location>
    <Families>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child1</ChildID>
                <ChildID>Child2</ChildID>
            </ChildList>
        </Family>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child3</ChildID>
                <ChildID>Child4</ChildID>
            </ChildList>
        </Family>
    </Families>
    <RemainingChildList>
        <ChildID>Child5</ChildID>
        <ChildID>Child6</ChildID>
    </RemainingChildList>
</FosterHome>

最佳答案

您可以执行以下操作。通过利用 @XmlElementWrapper,您可以减少所需的类数量:

福斯特之家

package nov18;

import java.util.List;
import javax.xml.bind.annotation.*;

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

    @XmlElement(name="Orphanage")
    private String orphanage;

    @XmlElement(name="Location")
    private String location;

    @XmlElementWrapper(name="Families")
    @XmlElement(name="Family")
    private List<Family> families;

    @XmlElementWrapper(name="RemainingChildList")
    @XmlElement(name="ChildID")
    private List<String> remainingChildren;

}

家庭

package nov18;

import java.util.List;   
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Family {

    @XmlElement(name="ParentID")
    private String parentID;

    @XmlElementWrapper(name="ChildList")
    @XmlElement(name="ChildID")
    private List<String> childList;

}

演示

package nov18;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(FosterHome.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        FosterHome fosterHome = (FosterHome) unmarshaller.unmarshal(new File("src/nov18/input.xml"));

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

}

输入/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FosterHome>
    <Orphanage>Happy Days Daycare</Orphanage>
    <Location>Apple Street</Location>
    <Families>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child1</ChildID>
                <ChildID>Child2</ChildID>
            </ChildList>
        </Family>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child3</ChildID>
                <ChildID>Child4</ChildID>
            </ChildList>
        </Family>
    </Families>
    <RemainingChildList>
        <ChildID>Child5</ChildID>
        <ChildID>Child6</ChildID>
    </RemainingChildList>
</FosterHome>

更多信息


更新

Is there I easy way I can iterate/print out all the ChildID in the Family class?

您可以执行以下操作:

    for(Family family : fosterHome.getFamilies()) {
        System.out.println(family.getParentID());
        for(String childID : family.getChildList()) {
            System.out.println("    " + childID);
        }
    }

关于java - 如何使用 JAXB 在 Java 中解析这个 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186896/

相关文章:

php - 或者出现错误(文档末尾的额外内容)

java - 下面的配置是什么意思(jaxb-fluent-api)?

java - 如何打印对象的默认值?

java - Spring通过子类的方法名来声明事务语义

java - 如何使用 Java 创 build 计二维码?

android - 在 XML 中的自定义 ScrollView 上膨胀类时出错?

java - java中的回文函数

android - TextView 不显示分配给它的值

java - 在 Java 中从 hashmap 创建多个 XML 文件

jaxb - 通过绑定(bind)文件指定@XmlJavaTypeAdapter 类?