Как разобрать XML-файл в C # (результат API YouTube)?

2

Я пытаюсь проанализировать 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

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

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

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

Теги:
xsd

3 ответа

4
Лучший ответ

Вот несколько примеров, читающих 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 - 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
}
  • 0
    Спасибо! Это действительно проясняет это.
1

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

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

while (xmlItr.MoveNext()) ...

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

0

Вы можете использовать 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;
  }
}

Здесь также есть другой способ здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню