从XML中提取某些元素的列表
本文关键字:元素 列表 XML 提取 | 更新日期: 2023-09-27 18:21:20
我正在尝试创建一个C#应用程序,它可以从像这样的页面中提取数据。它基本上是一个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到XML的提及。。。提前感谢!
顺便说一句,我再次发布了这个问题(尽管表述不同)。我不知道为什么上次它被删除了。
如果可以,请使用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<string>
。
使用xsd.exe从XML文件生成类结构,然后将XML反序列化为该类结构。它应该非常简单。
查看此simpleXml库
https://bitbucket.org/kberridge/simplexml
顺便说一句,它在NuGet上!
安装包simpleXml
虽然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。