c#解析XML通过LINQ创建自定义对象

本文关键字:创建 自定义 对象 LINQ 通过 解析 XML | 更新日期: 2023-09-27 18:05:50

我知道关于这个话题有很多问题,但是我试过的例子都不适合我。

我有一个现有的XML文档,它是这样构造的:

<root>
    <ElementA>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
    </ElementA>
    <ElementA>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
    </ElementA>
    <ElementB>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
        <element4>sometext</element4>
        <element5>sometext</element5>
    </ElementB>
    <ElementB>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
        <element4>sometext</element4>
        <element5>sometext</element5>
    </ElementB>
    <ElementC>
        <element1>sometext</element1>
        <element2>sometext</element3>
    </ElementC>
    <ElementC>
        <element1>sometext</element1>
        <element2>sometext</element2>
    </ElementC>
</root>

我需要找到所有的ElementA, B和c,并创建一个类型为objA等的新对象,其属性对应于各自元素的子元素。下面是我尝试过的示例代码。

var doc = XElement.Load(filename);
var data = from ele in doc.Elements()
           where ele.Name.LocalName.Equals("ElementA")
           select new objA
           {
                name = ele.Element("element1").Value
                address = ele.Element("element2").Value
           };

但是当我尝试迭代"data"集合时,这会抛出一个null异常错误。我有什么不明白的吗?

c#解析XML通过LINQ创建自定义对象

您可以使用Elements("tagName"):

按名称获取元素
var data = from ele in doc.Elements("ElementA")
           select new objA
           {
               name = (string)ele.Element("element1"),
               address = (string)ele.Element("element2")
           };

您还应该使用(string)XElementInstance而不是XElementInstance.Value,以避免在XML中不存在元素时使用NullReferenceException

上面粘贴的代码为示例输入数据返回2个元素。