【问题标题】:How do I parse this xml in Java using DOM API?如何使用 DOM API 在 Java 中解析这个 xml?
【发布时间】:2014-02-26 12:56:27
【问题描述】:

我正在尝试解析一个 xml 文件并且只想获取某些信息。

...
<field name="firstname">
    <value>John</value>
</field>
<field name="lastname">
    <value>Citizen</value>
</field>
<field name="DoB">
    <value>01/01/1980</value>
</field>
<field name="Profession">
    <value>"Manager"</value>
</field>
....

我有文档,现在我可以通过循环标记的 NodeList 打印出所有值,但是,我不知道如何获取特定值,例如我只想要列表中的姓氏和职业,所以我的目标是我想要:“公民”和“经理”

请提供任何线索。

谢谢

【问题讨论】:

  • 您是否在寻找 DOM 教程?网上肯定有几个。
  • 是的,你可以确定有一些,我已经经历了一些,但其中大多数都在使用没有属性的标签,例如名称如上例
  • 你可以通过递归来试试——我的详细例子之一here

标签: java xml parsing dom


【解决方案1】:

使用 DOM API 进行实验(试玩一下 Document、Element 和 Node 的方法),您将能够非常快速地操作 XML。

在下面的示例中,我将您的 XML 加载为字符串,提取节点并将它们放置在 Map 中。您可以使用它作为编写代码的起点。我刚刚在您的 XML 中添加了 &lt;root&gt;,这样我就可以将代码放在一个工作示例中。

public class DOMExampleStackOverflow3 {

    public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException, TransformerException {

        InputSource source = new InputSource(new StringReader("<root>\n" +
                                                            "<field name=\"firstname\">\n" +
                                                            "    <value>John</value>\n" +
                                                            "</field>\n" +
                                                            "<field name=\"lastname\">\n" +
                                                            "    <value>Citizen</value>\n" +
                                                            "</field>\n" +
                                                            "<field name=\"DoB\">\n" +
                                                            "    <value>01/01/1980</value>\n" +
                                                            "</field>\n" +
                                                            "<field name=\"Profession\">\n" +
                                                            "    <value>Manager</value>\n" +
                                                            "</field>\n" +
                                                            "</root>" ));

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        Document document = documentBuilder.parse(source);

        NodeList allFields = (NodeList) document.getElementsByTagName("field");

        Map<String, String> data = new HashMap<>();
        for(int i = 0; i < allFields.getLength(); i++) {
            Element field = (Element)allFields.item(i);
            String nameAttribute = field.getAttribute("name");
            Element child = (Element)field.getElementsByTagName("value").item(0);
            String value = child.getTextContent();
            data.put(nameAttribute, value);
        }

        for(Map.Entry field : data.entrySet()) {
            System.out.println(field.getKey() + ": " + field.getValue());
        }
    }
}

结果是:

firstname: John
Profession: Manager
DoB: 01/01/1980
lastname: Citizen

现在您可以更改代码并使用条件块中的属性信息提取您需要的内容。

【讨论】:

    【解决方案2】:

    您可能只使用 XPath。这是一个使用Xsylum的例子:

    XmlDocument doc = Xsylum.documentFor(xml);
    String lastName = doc.value("//field[@name='lastname']/value/text()");
    String profession = doc.value("//field[@name='Profession']/value/text()");
    

    【讨论】:

      【解决方案3】:
      Try This......
      
      
      package com.mkyong.seo;
      
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.DocumentBuilder;
      import org.w3c.dom.Document;
      import org.w3c.dom.NodeList;
      import org.w3c.dom.Node;
      import org.w3c.dom.Element;
      import java.io.File;
      
      public class ReadXMLFile {
      
        public static void main(String argv[]) {
      
          try {
      
          File fXmlFile = new File("/Users/mkyong/staff.xml");
          DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(fXmlFile);
      
          //optional, but recommended
          //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
          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());
      
              }
          }
          } catch (Exception e) {
          e.printStackTrace();
          }
        }
      
      }
      
      
      
      
      For More Reference: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
      

      【讨论】:

      • 这个我已经看过了,但是有了NodeList之后,如何区分标签,我需要检查标签是否有属性名= "职业"
      • eElement.getElementsByTagName("field").item(0).getnodeName() 它将返回您的字段名称,然后您可以设置您想要的名称的条件 if(eElement.getElementsByTagName(" field").item(0).getnodeName().equals("Profession"))
      • 这里不鼓励只复制和粘贴其他网站的代码。
      猜你喜欢
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多