Почему XPath namespace-uri () не работает из коробки с Java? - PullRequest
3 голосов
/ 21 августа 2011

Я пытаюсь использовать функцию namespace-uri() в XPath для извлечения узлов на основе их полного имени. Запрос //*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN'] в этого онлайн-тестера XPath , среди прочего, правильно возвращает соответствующие узлы. Тем не менее, следующий автономный класс Java ничего не извлекает. Что я делаю не так с namespace-uri()?

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Test{
    public static void main(String[] args)throws Exception {

        XPathExpression expr = XPathFactory.newInstance().newXPath().compile(
                "//*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN']");
        String xml=
            "<Agents xmlns:n=\"http://example.com/officeN\">\n"+
            "\t<n:Agent>\n\t\t<n:customerName>Joe Shmo</n:customerName>\n\t</n:Agent>\n"+
            "\t<n:Agent>\n\t\t<n:customerName>Mary Brown</n:customerName>\n\t</n:Agent>\n</Agents>";
        System.out.println(xml);
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
        NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
        System.err.println("\n\nNodes:");
        for (int i = 0; i < nodes.getLength(); i++) {
            System.err.println(nodes.item(i));

        }
    }
}

1 Ответ

3 голосов
/ 21 августа 2011

Запрос выглядит нормально. Вам также нужно объявить ваш DocumentBuilderFactory как «поддерживающий пространство имен».

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...