3

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

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

//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>
4

1 回答 1

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
于 2012-10-18T01:50:02.817 回答