Есть ли одно выражение XPath, которое я могу использовать для навигации по XML в разделе CDATA? - PullRequest
1 голос
/ 15 ноября 2010

Я пытаюсь выяснить, как использовать XPath для получения значений exceptionID и toolID из фрагмента XML в следующем документе XML (да, наличие XML в CDATA немного странно, но это то, что я получаю изСторонний сервис)

<?xml version="1.0"?>
  <exception>
    <info>
      <![CDATA[
        <info>
          <exceptionID>1</exceptionID>
          <instrumentID>1</instrumentID>
        </info>
      ]]>
    </info>
</exception>

Возможно ли получить значения в одном операторе XPath?

Я использую javax.xml.xpath.XPath внутри Java (JDK 1.5 с Xalan 2.7.1 и Xerces 2.9.1), например

XPath xpath = XPathFactory.newInstance().newXPath();

Long exceptionId  = new Long(((Double)xpath.evaluate(this.exceptionIdXPath, 
                               document, XPathConstants.NUMBER)).longValue());

Это переменная this.exceptionIdXPath, которую я не знаю, как установить, я знаю, например, что:

/exception/info/text()/info/exceptionIDне будет работать (text () возвращает данные внутри CDATA, но без «знания», что это XML)

Ответы [ 2 ]

5 голосов
/ 15 ноября 2010

Да, вы можете сделать это.Но все, что находится внутри раздела CDATA, является строкой и не будет частью DOM.Поэтому вы должны использовать функции XPath для работы со строками.

В XPath вы можете использовать substring-before и substring-after.Примерно так может работать:

substring-before(substring-after(/exception/info,"<exceptionID>"), "</exceptionID>")
2 голосов
/ 15 ноября 2010

Это будет очень специфично для инструментов, которые вы используете (было бы хорошо знать, какую платформу и библиотеки вы используете), но, как правило, вы не можете сделать это за один шаг. Весь смысл CDATA в том, что это необработанные символьные данные, а не обязательно XML.

Что вы можете сделать, это захватить текст () в исключении / информации (в основном содержимое вашего блока CDATA) и создать из него новый XML-документ (в памяти), а затем использовать XPath поверх этого документа.

Подробные шаги для этого зависят от платформы.

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