簡體   English   中英

如何使用相同的父標簽和子標簽解析Java中的XML?

[英]How to parse XML in Java with identical parent and child tags?

考慮以下xml:

<?xml version="1.0"?>
<company>
    <staff id="1001">
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff id="2001">
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>  

我需要檢索XML標記值。當沒有相同名稱的父節點和子節點時,以下代碼可以完美地工作。

File fXmlFile = new File("xmls.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);
    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
    NodeList nList = doc.getElementsByTagName("staff");
    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {
        Node nNode = nList.item(temp);
        System.out.println("\nCurrent Element :" + nNode.getNodeName());
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            System.out.println("Staff id : "
                               + eElement.getAttribute("id"));
            System.out.println("First Name : "
                               + eElement.getElementsByTagName("firstname")
                                 .item(0).getTextContent());
            System.out.println("Last Name : "
                               + eElement.getElementsByTagName("lastname")
                                 .item(0).getTextContent());
            System.out.println("Nick Name : "
                               + eElement.getElementsByTagName("nickname")
                                 .item(0).getTextContent());
            System.out.println("Salary : "
                               + eElement.getElementsByTagName("salary")
                                 .item(0).getTextContent()); }}

如下所示,當xml中有相同的父節點和子節點時,我需要在代碼中提供多少機會。

<?xml version="1.0"?>
    <company>
        <staff id="1001">
            <firstname>yong</firstname>
            <lastname>mook kim</lastname>
            <nickname>mkyong</nickname>
            <salary>100000</salary>
            <staff>10</staff>
        </staff>
        <staff id="2001">
            <firstname>low</firstname>
            <lastname>yin fong</lastname>
            <nickname>fong fong</nickname>
            <salary>200000</salary>
        </staff>
    </company>

如果您只關心這些值,則創建Java POJO以使用Jackson解析XML。 讓框架完成所有繁重的工作。

public class Company
{
    private Staff[] staff;

    public Staff[] getStaff ()
    {
        return staff;
    }

    public void setStaff (Staff[] staff)
    {
        this.staff = staff;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [staff = "+staff+"]";
    }
}

public class Staff
{
    private String id;

    private String nickname;

    private String lastname;

    private String firstname;

    private String salary;

    public String getId ()
    {
        return id;
    }

    public void setId (String id)
    {
        this.id = id;
    }

    public String getNickname ()
    {
        return nickname;
    }

    public void setNickname (String nickname)
    {
        this.nickname = nickname;
    }

    public String getLastname ()
    {
        return lastname;
    }

    public void setLastname (String lastname)
    {
        this.lastname = lastname;
    }

    public String getFirstname ()
    {
        return firstname;
    }

    public void setFirstname (String firstname)
    {
        this.firstname = firstname;
    }

    public String getSalary ()
    {
        return salary;
    }

    public void setSalary (String salary)
    {
        this.salary = salary;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [id = "+id+", nickname = "+nickname+", lastname = "+lastname+", firstname = "+firstname+", salary = "+salary+"]";
    }
}

然后,您可以使用以下命令填充Company POJO:

Company company = objectMapper.readValue(jsonFileAbove, Company.class);

您可能要使用XPath

XPath xpath = XPathFactory.newInstance().newXPath();
NodeList staffElements = (NodeList)
    xpath.evaluate("/company/staff", doc, XPathConstants.NOESET);

int count = staffElements.getLength();
for (int i = 0; i < count; i++) {
    Element staffElement = (Element) staffElements.item(i);

    System.out.println("Salary : "
        + staffElement.getElementsByTagName("salary")
            .item(0).getTextContent());

    NodeList staffChildren = + staffElement.getElementsByTagName("staff");
    if (staffChildren.getLength() > 0) {
        System.out.println("Staff count : "
            + staffChildren.item(0).getTextContent());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM