2015-06-11 4 views
1

Здравствуйте у меня есть этот XMLXPath - Как получить источник изображения из XML

 <item> 
     <title> Something for title»</title> 
     <link>some url</link> 
     <description><![CDATA[<div class="feed-description"><div class="feed-image"><img src="pictureUrl.jpg" /></div>text for desc</div>]]></description> 
     <pubDate>Thu, 11 Jun 2015 16:50:16 +0300</pubDate> 
    </item> 

Я пытаюсь получить IMG SRC с пути: //description//div[@class='feed-description']//div[@class='feed-image']//img/@src, но он не работает

есть ли решение?

+1

не собирается работать, потому что этот html находится внутри блока 'cdata'. это, по сути, один большой кусок текста внутри элемента ''. Вам нужно будет извлечь текстовое содержимое '', а затем передать его в новый синтаксический анализатор dom и выполнить извлечение' src'. –

+0

http://stackoverflow.com/questions/568315/how-do-i-retrieve-element-text-inside-cdata-markup-via-xpath – splash58

ответ

1

Раздел 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 и =. Но если точное форматирование предсказуемо, вы будете в порядке.

+0

Благодарим вас за ответ. Как я могу получить источник img с помощью подстроки-before() или substring-after(). Извините, я очень новичок в xpath –

+0

@kreshkas: Я отредактировал свой ответ, чтобы привести пример. – LarsH

+1

большое спасибо! отлично работает –

Смежные вопросы