XPath Query для выбора гиперссылки - PullRequest
0 голосов
/ 27 декабря 2010

Ниже приводится подмножество xml из фида в твиттере:

<entry>
    <id>tag:search.twitter.com,2005:18232030105964545</id>
    <published>2010-12-24T09:10:29Z</published>
    <link type="text/html" rel="alternate" href="http://twitter.com/KTNKenya/statuses/18232030105964545"/>
    <title>Synovate Poll: PM Raila Odinga remains the preffered presidential candidate at 42% while Uhuru Kenyatta is at 14%... http://fb.me/yjmMbmBx</title>
    <content type="html">Synovate Poll: PM &lt;b&gt;Raila&lt;/b&gt; Odinga remains the preffered presidential candidate at 42% while Uhuru Kenyatta is at 14%... &lt;a href=&quot;http://fb.me/yjmMbmBx&quot;&gt;http://fb.me/yjmMbmBx&lt;/a&gt;</content>
    <updated>2010-12-24T09:10:29Z</updated>
    <link type="image/png" rel="image" href="http://a3.twimg.com/profile_images/701825859/NEW_KTN_normal.png"/>
    <google:location>nairobi, kenya</google:location>
    <twitter:geo>
    </twitter:geo>
    <twitter:metadata>
        <twitter:result_type>recent</twitter:result_type>
    </twitter:metadata>
    <twitter:source>&lt;a href=&quot;http://www.facebook.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Facebook&lt;/a&gt;</twitter:source>
    <twitter:lang>en</twitter:lang>
    <author>
        <name>KTNKenya (KTN Kenya)</name>
        <uri>http://twitter.com/KTNKenya</uri>
    </author>
</entry>

Из элемента <title>...</title> мне нужно выбрать гиперссылку http://fb.me/yjmMbmBx через запрос XPath. Как мне это сделать? Является ли это возможным? * Я новичок в XPath.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

У вас есть два варианта:

  1. Используйте (xpath: "/ entry / title / text ()") и получите URL самостоятельно (например, с помощью регулярного выражения или найдите последний экземпляр "http://" в строке.
  2. Сначала получите данные:
    <code>
    /entry/content[@type="html"]/text()
    
    Затем вам нужно проанализировать это как HTML и извлечь любые теги и использовать атрибут href этих тегов. То, как вы выполните эту последнюю часть, зависит от языка / среды, в которой вы это делаете.

Обновление: Добавлен базовый пример кода для варианта 1 выше, как было запрошено:

xmlpp::Element *node = parser.get_document()->get_root_node();
xmlpp::NodeSet results = node->find("/entry/title/text()"); 
xmlpp::ContentNode* content = dynamic_cast<xmlpp::ContentNode*>(results.front());
std::string text = content->get_content();
std::string link = "";
int res = text.rfind("http://");
if(res == text.npos)
    res = text.rfind("https://");
if(res != text.npos)
    link = text.substr(res);
1 голос
/ 27 декабря 2010

С префиксом atom, связанным с http://www.w3.org/2005/Atom URI пространства имен, используйте:

/atom:feed/atom:entry/atom:title[contains(.,'http://')]

Выбирает каждый atom:title дочерний элемент atom:entry со строкой "http://", содержащейся в его строковом значении.

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