Разбор XML с XPath и пространствами имен в Java - PullRequest
5 голосов
/ 12 мая 2010

Можете ли вы помочь мне настроить этот код, чтобы он мог анализировать XML? Если я отбрасываю пространство имен XML, оно работает:

String webXmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                       "<foo xmlns=\"http://foo.bar/boo\"><bar>baz</bar></foo>";
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(new StringInputStream(webXmlContent));

NamespaceContextImpl namespaceContext = new NamespaceContextImpl();
namespaceContext.startPrefixMapping("foo", "http://www.w3.org/2001/XMLSchema-instance");
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(namespaceContext);

XPathExpression expr = xpath.compile("/foo/bar");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
System.out.println("Got " + nodes.getLength() + " nodes");

1 Ответ

9 голосов
/ 12 мая 2010
  1. Вы должны использовать префикс в вашем XPath, e. g .: "/ my: foo / my: bar" Вы можете выбрать любой префикс, который вам нравится - он не имеет никакого отношения к префиксам, которые вы используете или не используете в файле XML - но вы должны выбрать один. Это ограничение XPath 1.0.

  2. Вы должны выполнить префиксное сопоставление от "my" до "http://foo.bar/boo" (не до" http://www.w3.org/2001/XMLSchema-instance")

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