XPath возвращает ноль для xml с defaultNamespace - PullRequest
3 голосов
/ 07 декабря 2010

Я полагаю, что это работало некоторое время назад, но теперь xpath возвращает ноль.Может кто-нибудь помочь мне найти мою глупую ошибку в следующем коде?
Или мне придется предоставить NamespaceContext даже после setNamespaceAware (false)?

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(false);
domFactory.setIgnoringComments(true);
domFactory.setIgnoringElementContentWhitespace(true);

try {
 Document doc = domFactory.newDocumentBuilder().parse(new File("E:/Temp/test.xml"));
 XPath xp = XPathFactory.newInstance().newXPath();
 NodeList nl = (NodeList) xp.evaluate("//class", doc, XPathConstants.NODESET);
 System.out.println(nl.getLength());
}catch (Exception e){
 e.printStackTrace();
}

XML-документ здесь:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com/schema">
 <class />
 <class />
</root>

1 Ответ

5 голосов
/ 08 декабря 2010

Три варианта очевидны.Для начала, с моей точки зрения, проще всего:

  • изменить XPath с "//class" на "//*[local-name() = 'class']".Это немного глупо, но оно будет игнорировать пространства имен.Если это все равно дает ноль, вы знаете, что проблема не в пространствах имен.
  • зарегистрируйте префикс пространства имен для "http://www.example.com/schema" в вашем коде Java и используйте его в выражении XPath: "//foo:class"
  • выясните, какую реализацию парсера вы используете и почему она ведет себя не так, как у @ Родни, или перейдите на другую
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...