XPath с Yahoo API - PullRequest
       19

XPath с Yahoo API

1 голос
/ 21 августа 2009

Я ломал голову, пытаясь понять, как использовать C # / XPath / SelectNodes для извлечения узлов из результата XML API Yahoo.

У меня, по сути, та же проблема, что и в разделе

.

C # XmlDocument SelectNodes а также в узлы SelectNode, не работающие с фидом stackoverflow

Суть, на которой я застрял, - это точное понимание того, что использовать в качестве xmlns, и почему / нужно ли мне использовать префикс при обращении к узлу в XPath, поскольку у самих узлов XML нет префикса. .Net 3.5 не подходит для этого проекта.

Моя попытка кода (одна из нескольких итераций):

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);

        XmlNameTable table = new NameTable();
        XmlNamespaceManager mgr = new XmlNamespaceManager(table);
        mgr.AddNamespace("lcl", "urn:yahoo:lcl");

        XmlNodeList nodes = doc.GetElementsByTagName("//lcl:ResultSet/Result");
        // !nodes.Count is zero.

и XML, с которым я работаю:

<?xml version="1.0"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:yahoo:lcl" 
xsi:schemaLocation="urn:yahoo:lcl http://local.yahooapis.com/LocalSearchService/V3/LocalSearchResponse.xsd" 
totalResultsAvailable="35" totalResultsReturned="1" firstResultPosition="1">
<ResultSetMapUrl>http://maps.yahoo.com/broadband/?q1=San+Diego%2C+CA&amp;tt=Pizza&amp;tp=1</ResultSetMapUrl>
<Result id="20850086"><Title>Filippi's Pizza Grotto</Title><Address>1747 India St</Address>
<City>San Diego</City><State>CA</State><Phone>(619) 232-5094</Phone><Latitude>32.723421</Latitude>
<Longitude>-117.168194</Longitude><Rating><AverageRating>4</AverageRating>
<TotalRatings>115</TotalRatings><TotalReviews>32</TotalReviews><LastReviewDate>1246565979</LastReviewDate>
<LastReviewIntro>... edited ...</ClickUrl>
<MapUrl>http://maps.yahoo.com/maps_result?q1=1747+India+St+San+Diego+CA&amp;gid1=20850086</MapUrl>
<BusinessUrl>http://www.realcheesepizza.com/</BusinessUrl>
<BusinessClickUrl>http://www.realcheesepizza.com/</BusinessClickUrl><Categories><Category id="96926243">Pizza</Category>
<Category id="96926190">Italian Restaurants</Category>
<Category id="96926233">Continental Restaurants</Category>
<Category id="96926234">Carry Out &amp; Take Out</Category><Category id="96926236">Restaurants</Category>
</Categories></Result></ResultSet>
<!-- ws01.ydn.gq1.yahoo.com uncompressed/chunked Thu Aug 20 17:56:17 PDT 2009 -->

Ответы [ 2 ]

2 голосов
/ 21 августа 2009

Не могу не сказать, что это похоже на домашнюю работу. В коде есть некоторые ошибки, из-за которых создается впечатление, что умышленно сделано неправильно.

  • Почему вы передаете выражение XPath на GetElementsByTagName()?
  • Почему вы создаете новый NameTable, который не имеет отношения к фактическому XML-документу?
  • Почему вы используете префикс пространства имен для первого элемента в пути (ResultSet), а не для второго (Result), даже если они оба находятся в одном пространстве имен?

Это работает:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("lcl", "urn:yahoo:lcl");

XmlNodeList nodes = doc.SelectNodes("/lcl:ResultSet/lcl:Result", mgr);
2 голосов
/ 21 августа 2009

Попробуйте

XmlNodeList nodes = doc.SelectNodes("//lcl:ResultSet/lcl:Result",mgr);

Узлы в xml не имеют префикса, но у них есть пространство имен, указанное в xmlns = "...". Поэтому при выполнении запроса XPath вам необходимо предоставить пространство имен для элементов, которые вы ищете. Менеджер пространства имен и префикс позволяют вам сделать это.

Ваш запрос, вероятно, будет работать немного быстрее, используя только одну косую черту.

XmlNodeList nodes = doc.SelectNodes("/lcl:ResultSet/lcl:Result",mgr);
...