从XML中提取某些元素的列表

时间:2012-01-24 15:30:03

标签: c# xml

我正在尝试创建一个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 ...提前致谢!

顺便说一句,我已经再次发布了这个问题(虽然表达方式不同)。我不确定为什么它上次被删除了。

4 个答案:

答案 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)

查看这个simpleXml库

https://bitbucket.org/kberridge/simplexml

顺便说一下,它在NuGet上!

Install-package simpleXml

答案 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。