2013-11-02 3 views
3

Допустим, у меня есть XML, который выглядит следующим образом:, что XPath для выбора содержимого CDATA, когда некоторые Чайлдсы существуют

<a> 
    <b> 
    <![CDATA[some text]]> 
    <c>xxx</c> 
    <d>yyy</d> 
    </b> 
</a> 

Я не могу найти способ, чтобы получить «текст». Есть идеи?

Если я использую «а/б» возвращает также ххх и ууу Если я использую «A/B/текст()» она ничего не возвращает

ответ

3

Вы не можете фактически выбрать раздел CDATA: CDATA это просто способ сказать анализатор, чтобы избежать неэкранированной специальных символов, и ваш входной документ выглядит XPath точно так же, как:

<a> 
    <b> 
    some text 
    <c>xxx</c> 
    <d>yyy</d> 
    </b> 
</a> 

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

Выражение XPath a/b/text() должно выбирать три текстовых узла, из которых первый содержит «некоторый текст» вместе с окружающим пробелом.

+0

ОК, так что в основном это выглядит по любой причине текста () немного запутывается, когда CDATA является частью внутренних узлов и ничего не возвращает. выглядит как единственный правильный способ справиться с этим (и быть надежным на любом движке xpath) - это добавить определенный узел, который будет содержать раздел CDATA, затем ... Thx! – DaveG

0

С данными XPath модель путь /a/b/text()[1] должен выбрать текстовый узел со значением строки

некоторые текст

что разрыв строки, некоторые пробелы, текст some text с последующим разрывом строки и некоторые пробелы.

+0

хорошо ... Я не уверен, что порядок ребенка обязательно известен, поэтому я не могу быть уверен, что раздел CDATA на первой позиции ... – DaveG