【问题标题】:How to parse XML in Java with identical parent and child tags?java - 如何在Java中解析具有相同父子标签的XML?
【发布时间】:2018-08-03 13:22:08
【问题描述】:

考虑这个 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 xml xml-parsing


    【解决方案1】:

    如果您只关心值,那么创建 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);
    

    【讨论】:

      【解决方案2】:

      你可能想使用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());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        相关资源
        最近更新 更多