Раздел CDATA избегает его содержимого. Другими словами, CDATA не позволяет его содержимое анализироваться как разметка, когда анализируется остальная часть документа. Так что <div>
s там не видны как элементы XML, только как плоский текст. Элемент <description>
не имеет дочерних элементов ... только одного текстового дочернего элемента. Таким образом, XPath не может выбрать ни одного <div>
потомок <description>
, поскольку в анализируемом дереве XML не существует.
Что делать?
Если ваша XPath-среда поддерживает XPath 3.0, вы можете использовать parse-xml(), чтобы превратить плоский текст в дерево, а затем используйте XPath, чтобы выбрать //div[@class='feed-description']//div[@class='feed-image']//img/@src
из полученного дерева.
В противном случае лучшим решением может быть использование примитивных функций строковой обработки, таких как substring-before()
, substring-after()
или match()
. (Последний использует регулярные выражения и требует XPath 2.0.) Конечно, многие люди скажут вам не использовать регулярные выражения для анализа разметки, как XML и HTML. По уважительной причине: в общем случае очень сложно сделать это правильно (с регулярными выражениями или обычными поисками строк). Но для очень ограниченных случаев, когда вход очень предсказуем, и в отсутствие лучших инструментов он может быть лучшим инструментом для работы, не связанной с идеей.
Например, для данных, приведенных в вашем вопросе, вы можете использовать
substring-before(substring-after(//description, 'img src="'), '"')
В этом случае внутреннего вызова substring-after(//description, 'img src="')
возвращается pictureUrl.jpg" /></div>text for desc</div>
, из которых подстрока до того "
является pictureUrl.jpg
.
Это не очень надежный, например, он потерпит неудачу, если между src
и =
. Но если точное форматирование предсказуемо, вы будете в порядке.
не собирается работать, потому что этот html находится внутри блока 'cdata'. это, по сути, один большой кусок текста внутри элемента ''. Вам нужно будет извлечь текстовое содержимое '', а затем передать его в новый синтаксический анализатор dom и выполнить извлечение' src'. –
http://stackoverflow.com/questions/568315/how-do-i-retrieve-element-text-inside-cdata-markup-via-xpath – splash58