Синтаксический анализ XML с учетом пространства имен — сопоставление не в корневом теге

Я использую Xerces 2.9.1 для выполнения парсинга XML. XML содержит пространство имен, и я настроил Xerces так, чтобы он учитывал пространство имен.

У меня определены два префикса: rec и com. rec определяется в корневом теге, а com объявляется в каждом узле, который его использует.

<rec:root xmlns:rec="...">
   <rec:dummy ...>
      <com:item xmlns:com="..." />
    ...

Я получаю исключение при разборе следующего выражения XPath:

/rec:root/rec:dummy/com:item

XPathStylesheetDOM3Exception: префикс должен разрешаться в пространство имен: com

Я нашел это в блоге, там говорится о Xalan, но я заметил, что у Xerces такое же поведение.

Что ж, вы можете утверждать, что это недостаток дизайна, поскольку он использует только сопоставление, найденное в переданном ему узле, то есть в объявлениях пространства имен верхнего уровня в нашем случае. Итак, давайте переместим объявление пространства имен на верхний уровень, чтобы получить следующий ввод XML

Источник

Перемещение xmlns:com в корневой тег устраняет проблему, но я не могу контролировать этот файл.


person Olivier.Roger    schedule 04.04.2012    source источник
comment
Нет ли способа передать процессору XPath собственное сопоставление префикса и пространства имен? В любом случае это звучит как хорошая идея, вы не должны полагаться на то, что префикс будет одинаковым во всех входных файлах.   -  person millimoose    schedule 04.04.2012


Ответы (2)


префиксы xpath не имеют никакого отношения к префиксам, используемым в документе. вам необходимо предоставить сопоставление «префикса пространств имен» с обработчиком xpath. используя стандартные инструменты Java DOM, вы должны предоставить NamespaceContext в экземпляр XPath.

person jtahlborn    schedule 04.04.2012

Если вы используете DOM Level 3 XPath API, вам нужно написать класс, реализующий http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathNSResolver.html, который затем возвращает правильный URI пространства имен, когда префикс, используемый в выражении XPath, должен быть разрешен. Затем этот XPathNSResolver необходимо передать в качестве третьего аргумента метода оценки http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathEvaluator.html#оценить%28java.lang.String,%20org.w3c.dom.Node,%20org.w3c.dom.xpath.XPathNSResolver,%20short,%20java.lang.Object%29. Как уже отмечалось, префиксы в выражении пути не обязательно должны быть такими же, как во входном XML-документе, вам просто нужно убедиться, что XPathNSResolver сопоставляет префиксы, используемые в выражениях пути, с URI пространства имен, используемыми в XML-документе.

person Martin Honnen    schedule 04.04.2012