Я пытаюсь проанализировать 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, я был бы рад использовать его вместо этого.
Спасибо за любую помощь!
Вот несколько примеров, читающих 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
}
Я понимаю, что это было отвечено, а LINQ to XML - это то, с чем я бы поехал, но другим вариантом будет XPathNavigator. Что-то вроде
XPathNavigator xmlNav = xmlDoc.CreateNavigator(); XPathNodeIterator xmlitr = xmlNav.Select("/XPath/expression/here") while (xmlItr.MoveNext()) ...
Код у меня на голове, поэтому он может быть неправильным, и с XPathNavigator может быть лучший способ, но он должен дать вам общую идею
Вы можете использовать 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;
}
}
Здесь также есть другой способ здесь.