2016-02-18 37 views
0

我想在Java中讀取XML,但由於XML中對稱元素不對,無法讀取 - 還有,如何檢查節點是否可用或不如何通過Java 1.6讀取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>` 

這是代碼我trying-

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()); 
     } 
    } 
+0

*「無法讀取」*是什麼意思? – Andreas

+0

我的意思是,我無法在java中讀取上述xml –

+0

我剛剛在該XML上運行了您的代碼,並且它的讀取正常。由於第一個''中沒有''元素,因此代碼在'getElementsByTagName(「json-counter」)。item(0).getTextContent()'上的NPE上失敗了,但這是不同的。 XML解析沒有錯誤。 – Andreas

回答

0

我怎麼能檢查節點是否可用

getElementsByTagName()返回NodeList,它有一個getLength()方法,該方法將返回0如果未找到元素。

它也將返回一個值比1json-counterjson-property越大,所以硬編碼item(0)可能不是你應該做的事情。

此外,使用getElementsByTagName()意味着你提取的元素,無論位置,所以如果json-counterjson-property混合序列具有的意義,你不能使用getElementsByTagName()

+0

什麼應該是最好的方法來閱讀上面的XML? –

+0

取決於。 「'和''元素的混合順序是否重要? ---但通常使用'getFirstChild()'和'getNextSibling()'寫一個'for'循環來迭代所有的子節點。 – Andreas

+0

是的,訂單需要相同... getFirstChild()和getNextSibling() –

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如果元素不能被發現。

+0

你能解釋更多關於如何用xpath讀取嗎? –