如何用Java 1.6读取XML中的第三级节点

时间:2016-02-18 17:06:14

标签: java xml java-ee for-loop xpath

我试图在Java中阅读下面的XML,但是由于XML中没有对称元素,无法读取 - 而且,我如何检查节点是否可用

这是XML -

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <node-path path="USA">
      <property-name>Name</property-name>
      <property-value><![CDATA[Cat A]]></property-value>
       </node-path>
   <node-path path="Canada">
      <property-name>Name</property-name>
      <property-value />
   </node-path>
   <node-path path="Australia">
      <property-name>Name</property-name>
      <json-counter>1</json-counter>
      <json-property><![CDATA[Cat A]]></json-property>
      <json-property><![CDATA[Cat B]]></json-property>
      <json-property><![CDATA[Cat C]]></json-property>
      <json-counter>2</json-counter>
      <json-property><![CDATA[Cat D]]></json-property>
      <json-property><![CDATA[Cat E]]></json-property>
      <json-property><![CDATA[Cat F]]></json-property>
      <property-value />
   </node-path>
   <node-path path="UK">
      <property-name>Name</property-name>
      <property-value><![CDATA[0]]></property-value>
   </node-path>
</Root>`

这是我正在尝试的代码 -

 try {    
     File inputFile = new File("c://test.xml");
     DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
     Document doc = dBuilder.parse(inputFile);
     doc.getDocumentElement().normalize();

    NodeList nListNodePath = doc.getElementsByTagName("node-path");

     for (int i = 0; i < nListNodePath.getLength(); i++) {
        Node nNodePath = nListNodePath.item(i);
        if (nNodePath.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement1 = (Element) nNodePath;
            System.out.println("Node Path--- : "+ eElement1.getAttribute("path"));
            System.out.println("Property Name : " + eElement1.getElementsByTagName("property-name").item(0).getTextContent());
            System.out.println("Property value : " + eElement1.getElementsByTagName("property-value").item(0).getTextContent());
            System.out.println("Json Counter : " + eElement1.getElementsByTagName("json-counter").item(0).getTextContent());
            System.out.println("JSON property : " + eElement1.getElementsByTagName("json-property").item(0).getTextContent());
        }
    } 

2 个答案:

答案 0 :(得分:0)

  

如何检查节点是否可用

getElementsByTagName()返回NodeList,其getLength()方法会在找不到元素的情况下返回0

它还会为1json-counter返回大于json-property的值,因此硬编码item(0)可能不是您应该做的。

此外,使用getElementsByTagName()表示您无论位置如何都在提取元素,因此如果json-counterjson-property的混合序列具有含义,则无法使用{{ 1}}。

答案 1 :(得分:0)

您可以尝试使用Xpath工厂。您可以轻松地将节点转换为元素。

import javax.xml.xpath.XPathFactory;
.
.
.
XPath xpath = XPathFactory.newInstance().newXPath();
Node node = xpath.evaluate("/root/el1/el2[@attr='123']", yourDocOrNode, XPathConstants.NODE);

如果表达式无效,xpath.evaluate将抛出XPathExpressionException,如果找不到该元素,则返回null。