我正在尝试解析从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有更好的方法(更快,更少的内存),我很乐意使用它。
感谢您的帮助!
答案 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。