Проблемы с простым анализом Java DOM - PullRequest
1 голос
/ 27 августа 2011

Может кто-нибудь объяснить, почему это происходит. Я упростил свою проблему, создав простую программу, но узнаю подробности о проблеме, с которой я сталкиваюсь:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<title text=\"title1\">\n" +
"    <comment id=\"comment1\">\n" +
"        <data> abcd </data>\n" +
"        <data> efgh </data>\n" +
"    </comment>\n" +
"    <comment id=\"comment2\">\n" +
"        <data> ijkl </data>\n" +
"        <data> mnop </data>\n" +
"        <data> qrst </data>\n" +
"    </comment>\n" +
"</title>\n";

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));

System.out.println(doc.getFirstChild().getNodeName());
System.out.println(doc.getFirstChild().getFirstChild().getNodeName());

Соответствующий вывод это:

title
#text

Во-первых, почему я не могу получить узел comment?

Во-вторых, почему узел data интерпретируется как узел #text?

Какой был бы правильный и простой способ получить необходимые узлы. Также обратите внимание, что файл XML не является фиксированным; Я хочу произвольное решение. спасибо.

EDIT:

У меня похожая проблема при использовании Xpath, см. Код ниже:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/title/comment/data/text()");
NodeList result = (NodeList) expr.evaluate(msg.document(), XPathConstants.NODESET);
for(int i = 0; i < result.getLength(); i++)
    System.out.println(result.item(i).getNodeName() + " : " + result.item(i).getNodeValue());

Это дает вывод:

#text :  abcd 
#text :  efgh 
#text :  ijkl 
#text :  mnop 
#text :  qrst 

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Первый узел узла title - это текстовый узел, содержащий \n и четыре пробела перед началом элемента <comment>.

Чтобы получить узел комментария, запросите его у родителя.второй узел, или для его первого элемента по имени тега «комментарий».Вы также можете перебрать дочерние элементы и вернуть первый узел типа ELEMENT_NODE.

<data> - это узел элемента, содержащий текстовый узел.Значение текстового узла - «abcd».

0 голосов
/ 27 августа 2011

@ JB Низет объяснил, что происходит правильно.

Один из возможных обходных путей - настроить синтаксический анализатор на игнорирование "игнорируемых пробелов", вызвав setIgnoringElementContentWhitespace() на DocumentBuilderFactory. Я понимаю, что это приведет к тому, что синтаксический анализ не будет генерировать эти нежелательные текстовые узлы для пробелов между тегами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...