Простой анализ dom4j в Java - не удается получить доступ к дочерним узлам

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

<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms">
<Service>
<Name>WMS</Name>
<Title>Metacarta WMS VMaplv0</Title>
</Service>
<Capability>
<Layer>
<Name>Vmap0</Name>
<Title>Metacarta WMS VMaplv0</Title>
<Abstract>Vmap0</Abstract>
...

Может быть несколько узлов Layer, и любой узел Layer может иметь вложенный узел Layer. Я могу быстро выбрать все узлы слоя и выполнить итерацию по ним с помощью следующего кода xpath:

Map<String, String> uris = new HashMap<String, String>();
uris.put("wms", "http://www.opengis.net/wms");
XPath xpath1 = doc.createXPath("//wms:Layer");
xpath1.setNamespaceURIs(uris);
List nodes1 = xpath1.selectNodes(doc);

for (Iterator<?> layerIt = nodes1.iterator(); layerIt.hasNext();) {
            Node node = (Node) layerIt.next();
}

Я возвращаю все узлы Layer. Идеальный. Но когда я пытаюсь получить доступ к каждому дочернему узлу Name или Title, я ничего не получаю. Я пробовал столько различных комбинаций, о которых только мог подумать:

name = node.selectSingleNode("./wms:Name");
name = node.selectSingleNode("wms:Name");
name = node.selectSingleNode("Name");

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


person Bal    schedule 02.04.2014    source источник
comment
Попробуйте node.selectSingleNode("*:Name").   -  person Priyesh    schedule 03.04.2014


Ответы (2)


Я считаю, что Node.selectSingleNode() оценивает предоставленное выражение XPath с пустым контекстом пространства имен. Таким образом, нет никакого способа получить доступ к узлу без пространства имен по имени. Необходимо использовать такое выражение, как *[local-name='Name']. Если вам нужен/нужен контекст пространства имен, выполняйте выражения XPath через объект XPath.

person Michael Kay    schedule 02.04.2014
comment
К сожалению, при использовании *[local-name='Name']... т.е. Node name = node.selectSingleNode(*[local-name='Name']); Я точно не знаю, как правильно это сделать с объектом xpath. Когда я делал это в прошлом, он всегда обращался к самому первому объекту Layer в результате. Я не знаю, как использовать объект XPath, учитывая текущий узел, который я повторяю. - person Bal; 03.04.2014
comment
Ну, боюсь, я не эксперт по dom4j. Но xpath.selectNodes принимает аргумент узла, который используется в качестве элемента контекста для оценки выражения XPath. - person Michael Kay; 03.04.2014
comment
Спасибо за помощь - вы определенно заставили меня пойти по правильному пути, поэтому я голосую за ваш ответ. - person Bal; 03.04.2014

Спасибо всем за помощь. Это была последняя подсказка Майкла Кея, которая помогла мне... Мне нужно было использовать относительный путь от текущего узла, включить URI пространства имен и выбрать из контекста текущего узла, который я повторяю:

Map<String, String> uris = new HashMap<String, String>();
uris.put("wms", "http://www.opengis.net/wms");
XPath xpath1 = doc.createXPath("//wms:Layer");
xpath1.setNamespaceURIs(uris);
List nodes1 = xpath1.selectNodes(doc);

for (Iterator<?> layerIt = nodes1.iterator(); layerIt.hasNext();) {
    Node node = (Node) layerIt.next();
    XPath nameXpath = node.createXPath("./wms:Name");
    nameXpath.setNamespaceURIs(uris);
    XPath titleXpath = node.createXPath("./wms:Title");
    titleXpath.setNamespaceURIs(uris);
    Node name = nameXpath.selectSingleNode(node);
    Node title = titleXpath.selectSingleNode(node);
}
person Bal    schedule 03.04.2014