2013-01-14 2 views
6

Я использую DOM4J для XML работы в Java, мой XML, как это:DOM4J SelectNodes (Arg) не дают список узлов

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<abcd name="ab.catalog" xmlns="http://www.xyz.com/pqr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyz.com/pqr ./abc.xyz.xsd">    
<efg> 
...... 
</efg> 
<efg> 
..... 
</efg> 
</abcd> 

затем,

List<Node>list = document.selectNodes("/abcd/efg"); 

получает размер нулевого списка. Я чувствую, что это связано с пространством имен, указанным в xml. Я пробовал много, но не добился успеха.

ответ

9

Имена неповрежденных элементов в выражениях XPath относятся к элементам, которые не находятся в пространстве имен, - они не учитывают «пространство имен» xmlns="...", объявленное в документе. Вам нужно объявить префикс для пространства имен в процессоре XPath, а затем использовать этот префикс в выражении. Вот пример вдохновил the DOM4J javadocs:

Map uris = new HashMap(); 
uris.put("pqr", "http://www.xyz.com/pqr"); 
XPath xpath = document.createXPath("/pqr:abcd/pqr:efg"); 
xpath.setNamespaceURIs(uris); 
List<Node> nodes = xpath.selectNodes(document); 
+0

@ Ян: thanxs, он работает, но у меня есть запрос, если я должен получить еще немного узла или узла значение в от дочернего до дочернего узла, тогда я попытался как указано выше, например> для (узел узла: узлы) { \t XPath xpath1 = document.createXPath ("// edx: Name/value-"); \t xpath1.setNamespaceURIs (uris); \t Node nameNode = (Node) xpath1.selectSingleNode (node); \t} но он дает имяNode null. как сделать его работоспособным, как dom4j. любой вход будет заметным. – user1808932

+0

@ user1808932 '// edx: Name/value-' - это путь _absolute_, который начнет искать корневой узел документа, который содержит 'node'. Если вы хотите, чтобы «edx: Name» были потомками текущего «узла», вам нужно использовать относительный путь '.// edx: Name/value-' (с ведущей точкой). –

-3

Изменить код:

List<Node>list = document.selectNodes("//abcd/efg"); 
+3

это неправда. синтаксис '//' не имеет ничего общего с пространствами имен –

 Смежные вопросы

  • Нет связанных вопросов^_^