读<property>标签</property>

时间:2012-10-18 01:46:47

标签: c# .net xml xpath

我今天被要求查看一个新项目 - 阅读一些XML并进行一些分析。我知道一点C#。到目前为止,我已经使用了这个代码。我成功获得了4个节点列表。我有几个问题。首先,我不确定如何访问任何列表中任何节点上的标记内容。其次,我更喜欢能够使用LINQ查询,但XmlNodeList似乎不支持该语法。在下面的示例XML中,我希望能够获取属于特定IO组或mdisk的所有虚拟磁盘,这些虚拟磁盘由io_group_name或mdisk_grp_name属性确定。我查看的大部分内容都提供了访问[Attribute]列表的示例,并搜索了所有使用的属性/ atttributes互换。

我尝试的内容也在下面,它给出了一个空值异常。 “属性”列表只有一个属性。我找不到任何可以做我想要的例子,从调试器中的节点检查我需要访问什么来做我想做的事情并不清楚。

//this works

XmlTextReader reader = new XmlTextReader(_InputFile);
XmlDocument doc = new XmlDocument();
doc.Load(reader);

XmlNodeList clusterlist = doc.SelectNodes("//object[@type='cluster']");
XmlNodeList controllerlist = doc.SelectNodes("//object[@type='controller']");
XmlNodeList mdisklist = doc.SelectNodes("//object[@type='mdisk']");
XmlNodeList vdisklist = doc.SelectNodes("//object[@type='vdisk']");


// this did not work - got null value exception
foreach (XmlNode vdisknode in vdisklist)
{
    string str = vdisknode.Attributes["mdisk_grp_name"].Value;
}

XML示例:

<object type="vdisk">
     <property name="id" value="0" />
     <property name="name" value="nim01_vd06_gmt" />
     <property name="IO_group_id" value="0" />
     <property name="IO_group_name" value="ossvc06_iogrp0" />
     <property name="status" value="online" />
     <property name="mdisk_grp_id" value="0" />
     <property name="mdisk_grp_name" value="T1_OSIBM06_MDG1" />
     <property name="capacity" value="644245094400" />
     <property name="type" value="striped" />
</object>

1 个答案:

答案 0 :(得分:1)

object节点只有一个属性:type

string type = vdiskNode.Attributes["type"].Value;

property节点有两个属性:namevalue

string name = propertyNode.Attributes["name"].Value;
string value = propertyNode.Attributes["value"].Value;

我认为您需要扩展XPath查询:

"//object[@type='vdisk']/property[@name='mdisk_grp_name']/@value"

或者使用LINQ to XML:

from obj in doc.Load(xml).Root.Elements("object")
where (string)obj.Attribute("type") == "vdisk"
from prop in obj.Elements("property")
//where (string)prop.Attribute("name") == name
select prop.Value