【问题标题】:Getting error in parsing an XML file using JDOM使用 JDOM 解析 XML 文件时出错
【发布时间】:2011-10-02 18:54:53
【问题描述】:

我有这个 XML 文档:

<?xml version="1.0" encoding="utf-8"?>
<RootElement>
   <Achild>
      .....
   </Achild>
</RootElement>

如何检查文档是否包含Achild 元素?我试过了

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Use the factory to create a builder
try {
    final DocumentBuilder builder = factory.newDocumentBuilder();
    final Document doc = builder.parse(configFile);
    final Node parentNode = doc.getDocumentElement();
    final Element childElement = (Element) parentNode.getFirstChild();
    if(childElement.getNodeName().equalsIgnoreCase(...

但它给了我一个错误(childElement 为空)。

【问题讨论】:

  • 什么null,childElement本身,是节点名还是别的什么?
  • 您是指一个名为“AChild”的标签还是一般的子节点?
  • 我的意思是一个名为“Achild”的子节点
  • 正在提供类似 [#text....]

标签: java xml dom jdom


【解决方案1】:

我认为您将#text 节点(介于&lt;RootElement&gt;&lt;Achild&gt; 之间)作为第一个孩子(这是很常见的错误),例如:

final Node parentNode = doc.getDocumentElement();
Node childElement = parentNode.getFirstChild();
System.out.println(childElement.getNodeName());

返回:

#text

改用:

final Node parentNode = doc.getDocumentElement();
NodeList childElements = parentNode.getChildNodes();
for (int i = 0; i < childElements.getLength(); ++i)
{
    Node childElement = childElements.item(i);
    if (childElement instanceof Element)
        System.out.println(childElement.getNodeName());
}

想要的结果:

Achild

编辑:

使用DocumentBuilderFactory.setIgnoringElementContentWhitespace方法还有第二种方式:

factory.setIgnoringElementContentWhitespace(true);

但这仅适用于验证模式,因此您需要在 XML 文档中提供 DTD:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE RootElement [
    <!ELEMENT RootElement (Achild)+>
    <!ELEMENT Achild (#PCDATA)>
]>
<RootElement>
   <Achild>some text</Achild>
</RootElement>

并设置factory.setValidating(true)。完整示例:

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document doc = builder.parse("input.xml");

final Node rootNode = doc.getDocumentElement();
final Element childElement = (Element) rootNode.getFirstChild();

System.out.println(childElement.getNodeName());

想要的结果与原始代码:

Achild

【讨论】:

  • @Saurabh:不客气。请注意,JDOM API (jdom.org/docs/apidocs) 与标准 Java DOM API(包含在 JDK 中)不同。
  • 我有一个问题,比如做 parentNode.getChildNodes();也会让我获得 ACHild 的子子节点,或者只是 RootElement 的子节点。因为我不想要 Achild 的子节点,如果他正在迭代它,那么它将在性能方面花费我...... :)
【解决方案2】:

听起来 .getFirstChild() 正在返回一个文本节点,其中包含“”和“”之间的空白,在这种情况下,您需要前进到下一个兄弟节点才能到达您期望的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多