如何使用JDOM2解析XML时忽略已注释的内容

4
我在使用JDOM解析器解析XML时遇到了一些问题。当我尝试检索内容时,它会返回注释行。有没有办法忽略这些注释行?
Java代码:
SAXBuilder jdomBuilder = new SAXBuilder();
    // jdomDocument is the JDOM2 Object
    Document jdomDocument = jdomBuilder.build("C:/manu/WebservicesWS/DynamicXmlParse/src/PO_XML.xml");
    // The root element is the root of the document. we print its name
    System.out.println(jdomDocument.getRootElement().getName()); // prints
                                                                    // "rss"
    Element rss = jdomDocument.getRootElement();
    System.out.println(rss.getNamespaceURI());
    List<Element> rssChildren = rss.getChildren();
    // getElement(rssChildren);
    for (int i = 0; i < rssChildren.size(); i++) {
        Element rssChild = rssChildren.get(i);
        System.out.println(rssChild.getName());// prints 'title' and 'link'
        List<Content> rssContents = rssChild.getContent();
        for (int j = 0; j < rssContents.size(); j++) {
            Content content = rssContents.get(j);
            System.out.println(content.getValue());
        }
    }

XML结构
<interchange-control-header>
    <control-number>2</control-number>
    <sender-id>ZZ:IQAAOBUYER7</sender-id>
    <receiver-id>ZZ:33347456972</receiver-id>
    <!--sender-id>ZZ:IQAAOBUYER2</sender-id>
    <receiver-id>ZZ:IQAAOSUPPLIER2</receiver-id>        
    <sender-id>IQAOrionBuyer</sender-id>
    <receiver-id>IQAOrionSupplier</receiver-id-->           
    <date-time>2012-06-29T09:30:47-05:00</date-time>
    <control-version>1</control-version>
    <usage-indicator>T</usage-indicator>
    <is-copy>0</is-copy>
</interchange-control-header>

当前输出
interchange-control-header
2
ZZ:IQAAOBUYER7
ZZ:33347456972
sender-id>ZZ:IQAAOBUYER2</sender-id>
    <receiver-id>ZZ:IQAAOSUPPLIER2</receiver-id>        
    <sender-id>IQAOrionBuyer</sender-id>
    <receiver-id>IQAOrionSupplier</receiver-id
2012-06-29T09:30:47-05:00
1
T
0

需要的输出:
interchange-control-header
2
ZZ:IQAAOBUYER7
ZZ:33347456972
2012-06-29T09:30:47-05:00
1
T
0

不要调用 getContent 来获取所有子节点,而是使用 http://www.jdom.org/docs/apidocs/org/jdom2/filter/ElementFilter.html 中的 ElementFilter 调用 getContent 来仅处理子元素,从而忽略注释节点。 - Martin Honnen
1个回答

1

与元素一样,注释也被认为是XML文档中可识别的部分。需要注意的其他内容包括处理指令、文本和实体引用。

当您在rssChild元素上调用getContent时,您会获得注释内容,其值是该内容内部的文本。

看起来你只想打印出每个子元素的文本内容,而不是所有内容。

获取所有子元素的简单方法是使用getChildren()方法(而不是getContent)。你已经在其他地方使用了getChildren,所以我不知道你为什么忘记在这里使用它....

此外,您可以简化循环为for-each风格...这段代码:

List<Element> rssChildren = rss.getChildren();
// getElement(rssChildren);
for (int i = 0; i < rssChildren.size(); i++) {
    Element rssChild = rssChildren.get(i);
    System.out.println(rssChild.getName());// prints 'title' and 'link'
    List<Content> rssContents = rssChild.getContent();
    for (int j = 0; j < rssContents.size(); j++) {
        Content content = rssContents.get(j);
        System.out.println(content.getValue());
    }
}

could be:

for (Element rssChild : rss.getChildren()) {
    System.out.println(rssChild.getName());// prints 'title' and 'link'
    for (Element subRss : rssChild.getChildren()) {
        System.out.println(subRss.getValue());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接