Как разобрать XML-файл в C # (результат API YouTube)? - PullRequest
2 голосов
/ 02 августа 2009

Я пытаюсь проанализировать XML, возвращенный из API Youtue. API-вызовы работают правильно и создают XmlDocument. Я могу получить XmlNodeList тегов "entry", но я не уверен, как получить элементы внутри, такие как, и т.д ...

 XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50);
 XmlNodeList listNodes = xmlDoc.GetElementsByTagName("entry");
 foreach (XmlNode node in listNodes)
 {
     //not sure how to get elements in here
 }

Схема XML-документа показана здесь: http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html

Я знаю, что узел. Атрибуты - это неправильный вызов, но я не уверен, что правильный?

Кстати, если есть лучший способ (быстрее, меньше памяти) сделать это путем сериализации или использования linq, я был бы рад использовать это вместо этого.

Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 03 августа 2009

Вот несколько примеров чтения XmlDocument. Я не знаю, что быстрее или что нужно меньше памяти - но я бы предпочел Linq To Xml из-за его ясности.

XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50);
XmlNodeList listNodes = xmlDoc.GetElementsByTagName("entry");
foreach (XmlNode node in listNodes)
{
    // get child nodes
    foreach (XmlNode childNode in node.ChildNodes)
    {
    }

    // get specific child nodes
    XPathNavigator navigator = node.CreateNavigator();
    XPathNodeIterator iterator = navigator.Select(/* xpath selector according to the elements/attributes you need */);

    while (iterator.MoveNext())
    {
        // f.e. iterator.Current.GetAttribute(), iterator.Current.Name and iterator.Current.Value available here
    }
}

и linq to xml one:

XmlDocument xmlDoc = youtubeService.GetSearchResults(search.Term, "published", 1, 50);
XDocument xDoc = XDocument.Parse(xmlDoc.OuterXml);
var entries = from entry in xDoc.Descendants("entry")
              select new
              {
                  Id = entry.Element("id").Value,
                  Categories = entry.Elements("category").Select(c => c.Value)
              };

foreach (var entry in entries)
{
    // entry.Id and entry.Categories available here
}
1 голос
/ 03 августа 2009

Я понимаю, что на это ответили, и LINQ to XML - это то, с чем я бы пошел, но другой вариант - XPathNavigator. Что-то вроде

XPathNavigator xmlNav = xmlDoc.CreateNavigator();
XPathNodeIterator xmlitr = xmlNav.Select("/XPath/expression/here")

while (xmlItr.MoveNext()) ...

Код не в моей голове, поэтому он может быть неправильным и может быть лучший способ с XPathNavigator, но он должен дать вам общее представление

0 голосов
/ 03 августа 2009

Вы можете использовать XSD.exe для генерации класса на основе предоставленной схемы. После генерации вы можете затем проанализировать XML-ответ в строго типизированный класс.

string xmlResponse = GetMyYouTubeStuff();
MyYouTubeClass response = null;
XmlHelper<MyYouTubeClass> xmlHelper = new XmlHelper<MyYouTubeClass>();
response = xmlHelper.Deserialize(xmlResponse);

И класс для его десериализации ...

public class XmlHelper<T>
{
 public T Deserialize(string xml)
  {
    XmlSerializer xs = new XmlSerializer(typeof(T));

    Byte[] byteArray = new UTF8Encoding().GetBytes(xml);
    MemoryStream memoryStream = new MemoryStream(byteArray);

    XmlTextReader xmlTextReader = new XmlTextReader(memoryStream);

    T retObj = (T)xs.Deserialize(xmlTextReader);

    return retObj;
  }
}

Есть и другой способ здесь .

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