使用JDOM解析XML文件时出错

时间:2011-07-11 12:59:23

标签: java xml dom jdom

我有这个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为空)。

2 个答案:

答案 0 :(得分:1)

我认为您将#text节点(<RootElement><Achild>之间的节点)作为第一个孩子(这是相当常见的错误),例如:

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

答案 1 :(得分:0)

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