从指定的节点区域解析xml属性值

时间:2013-12-06 20:54:25

标签: c# xml

我有一个遵循以下结构的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();
   }
} 

2 个答案:

答案 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!");