Недавно я столкнулся с проблемой, связанной с нативным 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";
}
заставил вещь работать, и теперь я сделал так, чтобы пространство имен по умолчанию было обнаружено. Работает как шарм! Оба ответа помогли мне найти причину, и я бы выбрал оба в качестве предпочтительного ответа, если смогу.