Проблема ссылки на узлы напрямую при использовании XPath в Java - PullRequest
2 голосов
/ 16 марта 2009

Недавно я столкнулся с проблемой, связанной с нативным XML API Java (W3C), который по своей сути заключается в том, что если я попытаюсь использовать в своем документе прямое выражение XPath, например, //body XPath оценивается как ложное (неправильное поведение) , однако, если я заменю его на //*[1], оно оценивается как истинное (желаемое поведение) .

Я неоднократно проверял различные документы на предмет правильности используемого мной XML-кода ( Я использую в основном XHTML 2.0 с остальной частью этой системы ).

Поскольку я понятия не имею, что на самом деле вызывает это, вот набор параметров конфигурации для различных объектов фабрики, которые я использую.

Как видите, у меня есть множество пользовательских реализаций различных классов, связанных со всей проблемой, которые, я думаю, могут иметь какое-то отношение к проблеме, но я не уверен, бегать с юнит-тестами, играть с отладчиком и огромное количество .println: s мне еще не помогло.

XPath:

  • xpathfactory.setXPathFunctionResolver(myFunctionResolver)
  • xpath.setNamespaceContext(myNamespaceContext);
  • xpath.setXPathVariableResolver(myResolver);

DocumentBuilder:

(f == DocumentBuilderFactory)

(dc == DocumentBuilder)

  • dc.setEntityResolver(null);
  • dc.setErrorHandler(myErrorHandler);

Также стоит упомянуть, что я использую Sun Java 5 на Windows XP.

На данный момент приветствуются все идеи, я очень расстроен из-за этой проблемы.

Заключение

Это была проблема с пространством имен, проблема в том, что я вообще не объявлял default namespace в myNamespaceContext! Просто добавив

else {
    return "http://www.w3.org/1999/xhtml";
}

заставил вещь работать, и теперь я сделал так, чтобы пространство имен по умолчанию было обнаружено. Работает как шарм! Оба ответа помогли мне найти причину, и я бы выбрал оба в качестве предпочтительного ответа, если смогу.

Ответы [ 2 ]

4 голосов
/ 16 марта 2009

Не знаком с Java, но для всего мира это звучит как проблема с пространством имен - предположительно, пространство имен по умолчанию для документа и оценщика различаются.

edit: можем ли мы увидеть ваш XML документ и код? И как //*[local-name()='body'] отвечает?

3 голосов
/ 16 марта 2009

Если это XHTML, то для него будет определено пространство имен . Вы либо удалите это (не обязательно рекомендуется), либо квалифицируете свое выражение так:

//:body

(обратите внимание на двоеточие, которое квалифицирует вышеупомянутое) enter code here

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