【问题标题】:Extract a list of certain elements from XML从 XML 中提取某些元素的列表
【发布时间】:2012-01-24 15:30:03
【问题描述】:

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

顺便说一句,我再次发布了这个问题(尽管表述方式不同)。我不知道为什么它上次被删除。

【问题讨论】:

标签: c# xml


【解决方案1】:

如果可以,请使用 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)
                             });

它返回一个匿名类型列表,每个类型都有一个string 类型的属性AlbumTitle 和一个代表曲目标题的IEnumerable&lt;string&gt;

【讨论】:

  • 谢谢!我只是注意到我忘记了一个重要的信息。我将它添加到上面的代码中。
  • 新的标题标签是什么?专辑名称?
  • @KeyMs92:好吧,它仍然会以这种方式工作。它会先输出专辑标题,然后输出曲目标题。
  • 好的,你的意思是我只是跳过数组的第一个元素来获取所有曲目标题?是否有一种简单的方法来例如列出 tracklist 元素中的所有标题元素?
  • @KeyMs92:请参阅更新以获得更复杂的版本。
【解决方案2】:

使用xsd.exe 从您的XML 文件生成一个类结构,然后使用deserialize 您的XML 到该类结构中。它应该很简单。

【讨论】:

    【解决方案3】:

    查看这个 simpleXml 库

    https://bitbucket.org/kberridge/simplexml

    顺便说一下,它在 NuGet 上!

    安装包 simpleXml

    【讨论】:

      【解决方案4】:

      虽然 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)
      

      请注意,我在您的示例 URL 上添加了 ?f=xml,因为 API 的默认输出是 JSON。

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        相关资源
        最近更新 更多