【问题标题】:Parsing XML Textlist解析 XML 文本列表
【发布时间】:2010-01-21 15:24:29
【问题描述】:

我正在尝试解析 XML 文件。我能够解析普通的文本节点,但如何解析文本列表?不幸的是,我得到了文本列表的第一个孩子。如果我尝试做

 elem.nextSibling();

它总是不能为null,我知道还有另外两个值。

有人可以给我举个例子吗?

谢谢!

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>

【问题讨论】:

  • 你能发布你试图解析的 XML 吗? (或部分)
  • 没问题!请检查我的更新
  • 你用的是什么解析器?顺便说一句:使用 Apache Digester 可能比尝试像那样手动解析 XML 更容易。
  • 是否可以通过节点名在digester中定义规则?

标签: java xml parsing


【解决方案1】:

我假设您使用的是 DOM 解析器。

&lt;textlist&gt; 节点的第一个子节点不是第一个 &lt;text&gt; 节点,而是包含&lt;textlist&gt; 结尾和&lt;text&gt; 开头之间的空格和回车符的原始文本。以下 sn -p 的输出(使用 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();
}

显示&lt;textlist&gt; 有五个子元素:两个&lt;text&gt; 元素以及它们之前、之间和之后的三个原始文本片段。

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

以这种方式解析 XML 时,很容易忽略 DOM 树的结构可能很复杂。您很快就会在错误的一代中迭代 NodeList,然后在您期望兄弟姐妹的地方得到空值。这就是人们想出各种 xml-to-java 东西的原因之一,从本土的 XMLHelper 类到 XPath 表达式再到 Digester 到 JAXB,所以只有在绝对必要时才需要进入 DOM 级别。

【讨论】:

  • 感谢您的详细回答。是的,在我使用 DOM 解析器的那一刻,它更容易解决。但我同意 - 我会研究消化器。
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2014-12-25
  • 2017-06-20
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2017-05-06
  • 2015-04-13
相关资源
最近更新 更多