【问题标题】:How to parse a XML file using Linq - descendants如何使用 Linq 解析 XML 文件 - 后代
【发布时间】:2012-07-04 20:21:56
【问题描述】:

我在 C# 中使用 XDocumentLinq-to-XML 解析以下 XML 时遇到问题:

<matches count="9">
<books count="4">
    <book>
        <key>books/batman_dark_knight_returns/frank_miller</key>
        <title>Batman: The Dark Knight Returns</title>
    </book>
    ...
</books>
<movies count="4">
    <movie>
        <key>movies/batman_tales_of_dark_knight/boy_kirklan</key>
        <title>Batman: Tales of the Dark Knight</title>
    </movie>
    ...
</movies>
<music count="1">
    <album>
        <key>music/dark_knight/hans_zimmer</key>
        <title>The Dark Knight</title>
    </album>
</music> </matches>

我非常非常错误的代码的 sn-p 是

var data = from query in xmlFeed.Descendants("books")
           select new Book
           {
               Title = (string)query.Element("book").Element("title"),

               count = (string)query.Element("stickers").Element("sticker").Element("count")

           };

searchListBox.ItemsSource = data;

关于如何解析像这样的 xml 以返回可以绑定到列表框的长列表中的书籍、电影、电视节目的任何帮助?

谢谢

【问题讨论】:

  • 目前还不清楚您要实现的目标。您希望结果是什么确切?单个books 元素是否有多个book 元素? Bookcount 属性是什么意思?贴纸从何而来?
  • @Jon 嗨 Jon 感谢您的回复。我正在使用的 api 根据搜索查询返回匹配项。计数是找到的对象的数量,可能是书籍、电影、录音艺术家等类型。因此,查询可以返回 9 个项目,由 4 本书、4 部电影和 1 位艺术家组成。我想在一个列表框中列出搜索结果。然后用户可以选择该项目以查看更多信息。
  • 但是在您的示例代码中,您将count 分配为一本书的属性,这看起来确实不正确。请您看看我的回答并评论这是否解决了您的问题,如果不能解决您想要更改的内容?

标签: c# xml linq parsing


【解决方案1】:

怀疑你想要这样的东西:

var books = xmlFeed.Descendants("book").Select(x => Book.FromXElement(x));
var movies = xmlFeed.Descendants("movie").Select(x => Movie.FromXElement(x));
var albums = xmlFeed.Descendants("album").Select(x => Album.FromXElement(x));

// I'm assuming you're using .NET 4 here, otherwise it becomes slightly uglier.
var allResults = books.Concat<object>(movies).Concat(albums).ToList();

假设您为每个类添加了一个静态 FromXElement 方法,我通常发现这是一种处理此类事情的干净方法。如果您愿意,您可以内联执行此操作,但是当您开始获取更多位时,它会使查询代码变得越来越大。

【讨论】:

    【解决方案2】:

    如果所有key 后跟title 节点:

    var all = xmlFeed.Descendants("key").Select(x => new {
              Key = x.Value,
              Title = ((XElement)x.NextNode).Value
              // else the Title would be
              // Title = x.Parent.Element("title").Value
              }).ToList();
    

    这会将所有键和标题作为一个长列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多