2016-07-11 120 views
0

查找節點,我有以下XML:XML解析:無法通過標記名

<?xml version="1.0" encoding="UTF-8"?> 
<subscriber> 
    <data name="quota"> 
     <![CDATA[ 
     <?xml version="1.0" encoding="UTF-8"?><usage><version>1</version><field name="Cid"/><field name="Time"/><field name="totalVolume">4</field><field name="inputVolume"/><field name="outputVolume"/><field name="serviceSpecific"/><field name="nextResetTime"/><field name="Type"/><field name="GrantedTotalVolume"/><field name="GrantedInputVolume"/><field name="GrantedOutputVolume"/><field name="GrantedTime"/><field name="GrantedServiceSpecific"/><field name="QuotaState"/><field name="RefInstanceId"/><field name="Name">TEST_QUOTA</field></usage> 
]]> 
    </data> 
</subscriber> 

爲了找到所有field節點,我寫道:

dbuilder = dbc.newDocumentBuilder(); 
Document doc = dbuilder.parse(new InputSource(new StringReader(xmlString))); 
NodeList nl = doc.getElementsByTagName("field"); 
log.debug("node list length: " + nl.getLength()); 
for(int i = 0 ; i < nl.getLength(); i++){ 
    Element e = (Element)nl.item(i); 
    log.debug("node: " + e); 
    String name = e.getAttribute("name"); 
} 

然而,NodeList的長度爲0,所以它找不到名稱爲field的任何節點。我想知道是否因爲field節點之外的元數據,如果是這樣,我怎樣才能訪問field節點?

+0

您是否提取了數據標籤的內容?任何在<![CDATA [區域]內不會註冊爲元素。 –

+0

哦,我明白了。我沒有。我應該首先'doc.getElementsByTagName(「data」)? –

+0

@ k5_如果他們沒有註冊爲元素,我該如何解析它們? –

回答

2

首先,你需要從最初的文檔

Document doc = dbuilder.parse(new InputSource(new StringReader(xmlString))); 
    Element subscriber = (Element) doc.getElementsByTagName("subscriber").item(0); 
    Element data = (Element) subscriber.getElementsByTagName("data").item(0); 

之後,你需要使用它的TextContent解析你真正想要的文檔中提取的數據元素。

Document doc2 = dbuilder.parse(new InputSource(new StringReader(data.getTextContent().trim()))); 
    Element usage = (Element) doc2.getElementsByTagName("usage").item(0); 
    NodeList nl = usage.getElementsByTagName("field");