Как получить элементы из XPath в Java - PullRequest
1 голос
/ 17 мая 2011

Я хочу получить данные из запроса XPath:

Element location = (Element) doc.query("//location[location_name='"+ locationName +"']/*").get(0).getDocument().getRootElement();
System.out.println(location.toXML());

Element loc = location.getFirstChildElement("location");
System.out.println(loc.getFirstChildElement("location_name").getValue());

Однако, что бы я ни выбрал, я всегда получаю 1 узел (из-за .get(0)).Я не знаю, как выбрать узел, который был выбран по запросу.

Я обнаружил, что должен привести узел к Элементу ( XOM, получающий атрибут из Узла? ), но ссылкутолько показывает, как выбрать первый узел.

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

Вызов getParent() для первого элемента в результате:

Builder parse = new Builder();
Document xml = parse.build("/var/www/JAVA/toForum.xml");

System.out.println(xml.query("//location[@id=83]/*").get(0).getParent().toXML());

Создает следующий вывод:

<location id="83">
  <location_name>name</location_name>
  <company_name>company a</company_name>
  <machines>
    <machine id="12">A</machine>
    <machine id="312">B</machine>
  </machines>
</location>
2 голосов
/ 03 июня 2011

Вызов, который вы делаете для getDocument(), возвращает весь документ XML.

Вызов query() возвращает объект Nodes, непосредственно содержащий ссылки на узлы, которые вы ищете.

Если вы измените на

Element location = (Element)doc.query(
            "//location[location_name='"+ locationName +"']/*").get(0);

System.out.println(location.getAttribute("location_name").getValue());

, все должно быть в порядке

РЕДАКТИРОВАТЬ (от extraneon)

Некоторое дополнительное объяснение не заслуживаетсамого ответа: выполнив

Element location = 
  (Element) doc.query("//location[location_name='" 
                       + locationName +"']/*").get(0)
            .getDocument().getRootElement();

, вы выполните поиск по дереву и получите запрошенный узел.Но затем вы вызываете getDocument().getRootNode() на элементе, который вы хотите, что даст вам самый верхний узел документа.

Таким образом, приведенный выше запрос можно упростить до:

Element location = (Element)doc.getRootElement();

, что не соответствует ожиданиям.

Это немного похоже на прыжок с трамплина.Вы спускаетесь туда, где вам нужно (элемент), но немедленно возвращаетесь туда, откуда вы пришли (корневой элемент).

0 голосов
/ 17 мая 2011

Непонятно (по крайней мере, для меня), что на самом деле нужно сделать. Из вашего запроса вы должны получить список узлов, соответствующих заданным критериям. Вы получите NodeList, а затем можете перебрать этот NodeList и получить содержимое каждого узла, например, с помощью getNodeValue.

...