2010-01-21 107 views
0

我想解析一個XML文件。我能解析正常的文本節點,但我如何解析文本列表?我得到了文本列表的第一個小孩,這可悲的是所有。如果我試圖做解析XML文本列表

elem.nextSibling(); 

它總是空的不能,我知道還有兩個其他值左。

有人可以提供一個例子嗎?

謝謝!

XML例如

<viewentry position="1" unid="7125D090682C3C3EC1257671002F66F4" noteid="962" siblings="65"> 
    <entrydata columnnumber="0" name="Categories"> 
     <textlist> 
      <text>Lore1</text> 
      <text>Lore2</text> 
     </textlist> 
    </entrydata> 
    <entrydata columnnumber="1" name="CuttedSubjects"> 
     <text> 
      LoreImpsum.... 
     </text> 
    </entrydata> 
    <entrydata columnnumber="2" name="$35"> 
     <datetime>20091117T094224,57+01</datetime> 
    </entrydata> 
</viewentry> 
+1

你可以發佈你試圖解析的XML嗎? (或部分) – 2010-01-21 15:27:43

+0

當然可以!請檢查我的更新請求 – onigunn 2010-01-21 15:30:50

+0

你在使用什麼語法分析器?順便說一句:使用Apache Digester比使用這種手動解析XML要容易得多。 – Uri 2010-01-21 15:33:50

回答

2

我假設你正在使用DOM解析器。

<textlist>節點的第一個孩子是不是第一<text>節點,而是一個包含<textlist>年底和<text>開始之間的空格和回車的原始文本。下面的代碼片段的輸出(使用的org.w3c.dom *和* javax.xml.parsers中。)

Node grandpa = document.getElementsByTagName("textlist").item(0); 
Node daddy = grandpa.getFirstChild(); 
while (daddy != null) { 
    System.out.println(">>> " + daddy.getNodeName()); 
    Node child = daddy.getFirstChild(); 
    if (child != null) 
     System.out.println(">>>>>>>> " + child.getTextContent()); 
    daddy = daddy.getNextSibling(); 
} 

表明<textlist>有五個孩子:前兩個<text>元素和三個原始文本塊,之間和之後。

>>> #text 
>>> text 
>>>>>>>> Lore1 
>>> #text 
>>> text 
>>>>>>>> Lore2 
>>> #text 

以這種方式解析XML時,很容易忽略DOM樹的結構可能很複雜。你可以很快地結束迭代錯誤代中的NodeList,然後你會得到你想要的兄弟。這就是爲什麼人們想出各種xml到java的東西的原因之一,從本土的XMLHelper類到XPath表達式到Digester到JAXB,所以你只有在絕對必須的時候才需要進入DOM級別。

+0

感謝您的詳細解答。是的,在我使用DOM解析器的時刻,解決它更容易。但我同意 - 我會研究蒸煮器。 – onigunn 2010-01-21 16:29:26