2017-10-09 190 views
0

串後空我有一個看起來像這樣的XML文檔:我得到的迴應作爲一個字符串XML文檔解析包含XML

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="/resources/transform.xslt"?> 
<map name="response"> 
    <prop name="numConsumers">87</prop> 
    <prop name="numOutEventsQueued">17</prop> 
    <prop name="numOutEventsUnAcked">2131</prop> 
    <prop name="numOutEventsSent">538108577</prop> 
</map> 

,所以我把它解析爲XML,並嘗試提取numConsumers(中值87):

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder; 

     builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new InputSource(new StringReader(xml))); 

     NodeList nodeList = doc.getChildNodes(); 
     for(int i = 0; i < nodeList.getLength(); i++) { 
      String numConsumers = nodeList.item(i).getTextContent(); 
     } 

但事實是,當i = 0numConsumerstype="text/xsl" href="/resources/transform.xslt"i = 1,這是子節點的所有值,連接在一起。我究竟做錯了什麼?我知道當前的代碼並沒有明確地尋找我想要的節點,但是現在我只是試圖看看我能否到達任何節點。

+1

可能是因爲您剛剛閱讀'<?xml-stylesheet>'屬性。你應該遵循一些關於如何首先閱讀完整的XML的教程。起初可能會很棘手。這裏是一個很好的開始[Java XML](https://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm#ADXDK3000) – AxelH

回答

1
NodeList nodeList = doc.getChildNodes(); 

在XML DOM中,一切都是節點。您的案例中的文檔在文檔級別具有2個節點聲明節點('xml-stylesheet')和文檔元素('map')。根據解析器的配置,如果在文檔元素之前或之後有任何空白(以及您沒有的架構,允許它),您就可以得到它。

一個讓你現在的樣子,在什麼是下面:

NodeList nodeList=doc.getDocumentElement().getElementsByTagName("prop"); 
for(int i=0;i<nodeList.getLength();i++{ 

String number=nodeList.item(i).getFirstChild().getNodeValue(); 

} 

通知的.getFirstChild()getNodeValue(),在XML DOM一切是一個節點,一個元素節點的內部內容不是節點的值,它是節點的第一個孩子,第一個孩子的值是'87'或其他值。

+0

謝謝,但有沒有一種方法可以讓我得到'每個子節點的名稱=「」?否則,我很難確定何時找到了正確的價值。 – Khaine775

+1

當然,有,將節點轉換爲元素(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Element.html)節點並使用getAttribute(「name」) – Ironluca