如何使用LINQ解析具有相同名称的子元素的XML?

时间:2011-10-20 20:06:52

标签: c# xml linq

背景资讯 在过去,我一直在学习XML文件的集合并遍历每个XML文件,解析它,将字符串数据传递给数据传输对象并将对象传递到数据库中。

之前,我的XML看起来像这样。

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

在这里,我只有一个元素。因此,我将使用LINQ解析XML并检索后续元素(title,summary,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来捕获我返回的信息。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

只需抓取您想要的元素,然后使用您的选择从子项填充dto。这样的东西没有经过测试

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

答案 1 :(得分:0)

上面的select语句将返回一个IEnumerable&lt; DTO&gt;,它是一系列DTO对象。对于它在XML中找到的每个消息节点,它将创建一个DTO对象并将其添加到返回的序列中。如果您的目标只是迭代所有DTO,那么您已经在那里了。如果你确实需要一个List&lt; DTO&gt;,那么通用List对象上有一个构造函数,它接受一个I​​Enumerable&lt; T&gt;,所以你可以传入你从select语句收到的“dtos”并有一个List。