如何在c#中解析XML文件(youtube api结果)?

时间:2009-08-02 19:01:03

标签: c# asp.net xml xsd

我正在尝试解析从Youtue API返回的XML。 APIcalls正常工作并创建XmlDocument。我可以得到一个“入口”标签的XmlNodeList,但我不知道如何获取内部的元素,如,等...

 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有更好的方法(更快,更少的内存),我很乐意使用它。

感谢您的帮助!

3 个答案:

答案 0 :(得分: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的一个:

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 :(得分:1)

我意识到这已经得到了回答,而LINQ to XML就是我的目标,但另一种选择是XPathNavigator。像

这样的东西
XPathNavigator xmlNav = xmlDoc.CreateNavigator();
XPathNodeIterator xmlitr = xmlNav.Select("/XPath/expression/here")

while (xmlItr.MoveNext()) ...

代码是我的头脑,所以它可能是错误的,并且XPathNavigator可能有更好的方法,但它应该给你一般的想法

答案 2 :(得分: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;
  }
}

还有另一种方式here