我试图使用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;代码仍然是错误的
答案 0 :(得分:3)
如果xDoc
为XDocument
,请输入
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();
}
}
}