Получение ошибки при разборе XML-файла с использованием JDOM - PullRequest
1 голос
/ 11 июля 2011

У меня есть этот документ 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 ]

1 голос
/ 11 июля 2011

Я думаю, что вы получаете #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);

Однако это работает только в режиме проверки, поэтому вам необходимо указать DTD в вашем XML-документе:

<?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
0 голосов
/ 11 июля 2011

Похоже, что .getFirstChild () возвращает вам текстовый узел, содержащий пробел между "" и "", и в этом случае вам нужно перейти к следующему братскому узлу, чтобы добраться туда, куда вы ожидаете.

...