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

时间:2013-03-24 14:20:41

标签: c# xml linq

我知道关于这个话题有很多问题,但我尝试过的例子中没有一个对我有用。

我有一个现有的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和Cs,并创建一个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异常错误。我不理解的是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用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个元素。