我有一个遵循以下结构的XML:
<model uir="model1">
<profile>
<profiles>
<timeseries>
<value double="24.7" index="2011-01-01 00:00" />
<value double="24.5" index="2011-01-02 00:00" />
<value index="2011-04-23 00:00" /> //Here for some reason i must have double=null
<value index="2011-04-24 00:00" />
<value double="24.7" index="2011-01-01 00:00" />
<value double="24.5" index="2011-01-02 00:00" />
</timeseries>
</profile>
</profiles>
</model>
<model uir="model2">
<profile>
<profiles>
<timeseries>
<value double="24.7" index="2011-01-01 00:00" />
<value double="24.5" index="2011-01-02 00:00" />
<value index="2011-04-23 00:00" /> //Here for some reason i must have double=null
<value index="2011-04-24 00:00" />
<value double="24.7" index="2011-01-01 00:00" />
<value double="24.5" index="2011-01-02 00:00" />
</timeseries>
</profile>
</profiles>
</model>
我想要的是获取属性 double 的值,并将其存储在每个模型的列表(或矢量)中。当节点值没有属性double时,插入null。在第一级,我尝试了以下,但当它到达一个没有属性双栈的节点。
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
class MyClass
{
static void Main(string[] args)
{
string file = @"C:\RDMS.xml";
XDocment doc = XDocument.Load(file);
foreach (var item in doc.Descendants("value"))
{
Console.WriteLine(item.Attribute("double").Value);
}
Console.ReadKey();
}
}
答案 0 :(得分:1)
你没有指定错误,但我猜你得到的是NullReferenceException
?您需要检查item.Attribute
是否实际返回值。
var doubleAttr = item.Attribute("double");
if(doubleAttr == null) continue;
Console.WriteLine(item.Attribute("double").Value);
如果这不是您的问题,那么请更具体地说明您的问题是什么。
以下trope的评论进一步澄清:
...你得到一个NullReferenceException,因为没有东西从item.Attribute(“double”)返回缺少该属性的元素,因此你不能再调用.Value,因为item.Attribute(“double”)为null ,并且您收到NullReferenceException。 index属性不会发生这种情况,因为所有“value”元素都有索引属性......
答案 1 :(得分:0)
如果是Attribute(string)
,您可以查看null
的结果:
var attrib = item.Attribute("double");
if (attrib != null)
Console.WriteLine(attrib.Value);
else
Console.WriteLine("attribute not found!");