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