C#LINQ代码不适用于XML解析

时间:2018-01-12 14:35:23

标签: c# xml linq

我试图使用LINQ来解析XML文件中的数据,但我的代码似乎不起作用,我无法弄清楚我做错了什么。

缩短版xml:

<Components>
   ....

<Component Id="b3d06054-6113-4775-9353-f48aa21295e8" ProductId="ERDDMR">
  <Sections>
    <ComponentSection Id="bb05507e-200d-494a-9aef-3181c039efc7" ProductSectionId="ERDDMR.Process" />
    <ComponentSection Id="391aead4-cfeb-4739-b8ec-c6b12664189f" ProductSectionId="ERDDMR.Exhaust" />
  </Sections>
  <VariantData Type="eContact">
    <Row Name="dampersize" Value="5610" Description="Return Damper Size" />
    <Row Name="damperactuators" Value="1" Description="Return (0=None, 1=2-Pos, 2=MOD)" />
    <Row Name="damperconstruction" Value="1" Description="Return (0=N/A, 1=VCD-23, 2=VCD-34" />
  </VariantData>
</Component>
<Component Id="f4130a92-aac1-4039-a4df-83d6994ae095" ProductId="ERDSIC">
  <Sections>
    <ComponentSection Id="1e65f0c4-db4f-4eb7-8605-e37f9d7e6f68" ProductSectionId="ERDSIC.1" />
  </Sections>
  <VariantData Type="eContact">
    <!-- *** Find this one, below! *** -->
    <Row Name="dampersize" Value="5926" Description="MUA Damper Size" /> 
    <Row Name="damperactuators" Value="1" Description="MUA (0=None, 1=2-Pos, 2=MOD)" />
    <Row Name="damperconstruction" Value="1" Description="MUA (0=N/A, 1=VCD-23, 2=VCD-34, 3=VCD-40" />
  </VariantData>
</Component>

...
</Components>

我试图找到行元素的属性,其属性名称为&#34; dampersize&#34;并且是Element&#34; Component&#34;的后代。其属性ProductId =&#34; ERDSIC&#34; (我在上面的xml中确定了它)

我失败的尝试就在这里:

var prop = xDoc.Elements("Component")
              .Where(c => c.Attribute("ProductId").Value == "ERDSIC")
                 .Descendants("Row").Where(t => t.Attribute("Name").Value == "dampersize")
                    .Select(v => v.Attribute("Value").Value).FirstOrDefault();

 Console.WriteLine("Result: " + prop.ToString());


我得到的错误是(位于Console.WriteLine行):

System.NullReferenceException: Object reference not set to an instance of an object

编辑 - 已更改&#34;输入&#34;到&#34;姓名&#34;代码仍然是错误的

3 个答案:

答案 0 :(得分:3)

如果xDocXDocument,请输入

var xDoc = XDocument.Load("test.xml");

然后使用Root属性:

var prop = xDoc.Root.Elements("Component")

或者将xDoc类型更改为XElement

var xDoc = XElement.Load("test.xml");

然后您的代码将完全正常运行。

答案 1 :(得分:2)

我建议你进行转换以获取值而不是使用Value属性来避免这种错误,我认为有一个节点没有属性或者你拼错了一些名字,

var prop = xDoc.Root.Elements("Component")
              .Where(c => (string)c.Attribute("ProductId") == "ERDSIC")
                 .Descendants("Row").Where(t => (string)t.Attribute("Name") == "dampersize")
                    .Select(v => (string)v.Attribute("Value")).FirstOrDefault();

答案 2 :(得分:0)

如果我将OP的XML放在Data.xml文件夹中名为\bin\Debug的文件中并运行以下命令,则可以正常工作,因此我只能假设他加载XML的方法不起作用, prop为空。

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

namespace Work
{
    public class Program
    {
        public static void Main(string[] _)
        {
            var folder = AppDomain.CurrentDomain.BaseDirectory;
            var path = Path.Combine(folder, "Data.xml");
            var xml = XElement.Load(path);

            var prop = xml.Elements("Component")
                .Where(c => c.Attribute("ProductId").Value == "ERDSIC")
                .Descendants("Row").Where(t => t.Attribute("Name").Value == "dampersize")
                .Select(v => v.Attribute("Value").Value).FirstOrDefault();

            Console.WriteLine("Result: " + prop);

            Console.ReadKey();
        }
    }
}