2016-07-11 92 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");