我有这个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
为空)。
答案 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()会返回一个包含“”和“”之间空白区域的文本节点,在这种情况下,您需要前进到下一个兄弟节点才能到达您期望的位置。