我正在尝试创建一个C#应用程序,用于从this之类的页面中提取数据。它基本上是一个存储音乐专辑信息的XML文件。这是相关的代码:
<resp stat="ok" version="2.0">
<release id="368116" status="Accepted">
<title>The Bends</title>
<tracklist>
<track>
<position>1</position>
<title>Planet Telex</title>
<duration>4:18</duration>
</track>
</tracklist>
</release>
我想从专辑中提取所有曲目标题(在上面的代码“Planet Telex”中)并将其输出到如下列表中:
Planet Telex
The Bends
...
最好/最优雅的方式是什么?根据我的阅读,XmlTextReader是一个很好用的类。我也看到很多提及Linq to XML ...提前致谢!
顺便说一句,我已经再次发布了这个问题(虽然表达方式不同)。我不确定为什么它上次被删除了。答案 0 :(得分:3)
如果可以,请使用LINQ to XML:
XDocument doc = XDocument.Load(xml);
var titles = doc.Descendants("title").Select(x => x.Value);
区分专辑和曲目标题的更复杂版本如下:
var titles = doc.Descendants("release")
.Select(x => new
{
AlbumTitle = x.Element("title").Value,
Tracks = x.Element("tracklist")
.Descendants("title")
.Select(y => y.Value)
});
它返回一个匿名类型列表,每个类型都有一个类型为AlbumTitle
的属性string
和一个代表曲目标题的IEnumerable<string>
。
答案 1 :(得分:0)
使用xsd.exe从XML文件生成类结构,然后将deserialize XML转换为该类结构。它应该非常简单。
答案 2 :(得分:0)
答案 3 :(得分:0)
虽然LINQ肯定是一种有效的方法,但我想我至少会提到一个快速的选择:XPath。这是一个例子:
XPathDocument doc = new XPathDocument("http://api.discogs.com/release/368116?f=xml");
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator iter = (XPathNodeIterator)nav.Evaluate("//tracklist/track/title");
while (iter.MoveNext())
{
Console.WriteLine(iter.Current.Value);
}
输出如下:
Planet Telex
The Bends
High And Dry
Fake Plastic Trees
Bones
(Nice Dream)
Just
My Iron Lung
Bullet Proof..I Wish I Was
Black Star
Sulk
Street Spirit (Fade Out)
请注意,我在您的示例网址上添加了?f = xml,因为API的默认输出是JSON。