2010-01-21 105 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