【问题标题】:How do I use LINQ to parse XML with child elements of the same name?如何使用 LINQ 解析具有同名子元素的 XML?
【发布时间】:2011-10-20 20:06:52
【问题描述】:

背景信息: 过去,我一直在收集 XML 文件的集合并遍历每个 XML 文件,对其进行解析,将字符串数据传递给数据传输对象,并将对象传递给数据库。

以前,我的 XML 是这样的。

<messages>
    <message>
        <title>Red Wall</title>
        <summary>This is a good article</summary>
        <ISBN>13546846545464</ISBN>
    </message>
</messages>

在这里,我只有一个元素。因此,我将使用 LINQ 解析 XML 并检索后续元素(标题、摘要、isbn)。然后我会初始化/实例化一个对象,将其属性分配给我检索到的值,然后将其发送出去。

现在我的 XML 看起来像这样:

<messages>
<message>
    <title>Red Wall</title>
    <summary>This is a good article</summary>
    <ISBN>13546846545464</ISBN>
</message>

<message>
    <title>Blue Wall</title>
    <summary>This is not a good article</summary>
    <ISBN>15648465416</ISBN>
</message>
</messages>

我的 XML 文件中现在有两个(或更多)元素,对于每个元素,我需要 1) 确定有多个元素并 2)每个都创建一个单独的 DTO 来保存我解析的数据。

我的问题是:如何解析具有多个标签的 XML 并将遇到的每个标签识别为彼此分开?

最后说明:在解析时,我需要能够实例化一个 DTO 以捕获我返回的信息。

感谢您的帮助!

【问题讨论】:

  • 对于每个文件,您需要在尝试解析之前确定它是否具有多个元素?

标签: c# xml linq


【解决方案1】:

只需抓住您想要的元素并使用您的选择从子项中填充 dto。像这样的东西没有测试过

XElement ele = loaded.Element("messages");    
dtos = from item in ele.Descendants("message")
    select new DTO() {title = item.Element(title).value ,... };

【讨论】:

  • 我是 LINQ 的新手。不知道您可以通过 select 语句进行实例化。性感。然后对于每条消息:如何将 DTO 添加到列表中?我需要为每个文件构建一个 DTO 列表,并将其返回给命中数据库的方法。再次感谢您的帮助。
  • @fullNelson:上面的代码是将每个 DTO 添加到 IEnumerable 集合 dtos。你可以直接在这个对象上调用.ToList().ToArray()
  • @rerun 或 @kaveman :我添加了代码并根据我的情况对其进行了调整,但是,当我分配 List&lt;ReviewDTC&gt; reviews = dtos.ToList&lt;ReviewDTO&gt;(); 时,它指出评论列表的计数为 0。所以看起来就像重新运行的代码没有构建对象一样。这可能吗?
  • 投射是否正确?使用扩展方法返回列表的计数是多少?您也可以在对象的构造函数中放置一个断点并检查它是否被调用。
  • 是的,演员表没有错误。它引用返回的列表为空。下面是我正在使用的完整方法(减去签名),以响应 JRack 的解决方案。
【解决方案2】:

上面的 select 语句将返回一个 IEnumerable,它是一个 DTO 对象序列。对于它在 XML 中找到的每个消息节点,它将创建一个 DTO 对象并将其添加到返回的序列中。如果您的目标只是遍历所有 DTO,那么您已经完成了。如果您确实需要 List,则在通用 List 对象上有一个接受 IEnumerable 的构造函数,因此您可以传入从 select 语句收到的“dtos”并拥有一个 List。

【讨论】:

  • 我现在有这个代码,当它到达返回语句时,我的评论列表似乎为空。我错过了你在这里说的话吗? XElement root = XElement.Load(fileInProcessingName); var dtos = from item in root.Descendants("message") select new ReviewDTC() { Summary = item.Element("summary").Value , Isbn = item.Element("ISBN").Value , PubDate = item.Element("PublicationDate").Value }; List&lt;ReviewDTC&gt; reviews = dtos.ToList&lt;ReviewDTC&gt;(); return reviews; }
  • 看起来您实际上并没有将来自item.Element(..).Value 的值传递给ReviewDTC 的构造函数。在调用 List&lt;ReviewDTC&gt; reviews = dtos.ToList&lt;ReviewDTC&gt; 之前,请查看断点中的 reviews IEnumerable,看看它是否按预期填充。
  • 嗯...看起来我的 ReviewDTC 类上只有一个空白构造函数。你是对的,在上面的代码的情况下,我实际上并没有初始化对象吗?
  • 我搞定了。像往常一样,我是一个pebkac。感谢您的补充帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多