Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阅读<;房地产>;标签_C#_.net_Xml_Xpath - Fatal编程技术网

C# 阅读<;房地产>;标签

C# 阅读<;房地产>;标签,c#,.net,xml,xpath,C#,.net,Xml,Xpath,今天我被要求看一个新项目——阅读一些XML并进行一些分析。我懂一点C。到目前为止,我已经用这段代码做到了这一点。我成功地获得了4个节点列表。我有几个问题。首先,我不知道如何访问任何列表中任何节点的标记中的内容。其次,我希望能够使用LINQ查询,但XmlNodeList似乎不支持这种语法。在下面的示例XML中,我希望能够获得由IO_Group_name或mdisk grp_name属性确定的属于特定IO组或mdisk的所有VDisk。我看到的大部分内容都给出了访问[Attribute]列表的示例,

今天我被要求看一个新项目——阅读一些XML并进行一些分析。我懂一点C。到目前为止,我已经用这段代码做到了这一点。我成功地获得了4个节点列表。我有几个问题。首先,我不知道如何访问任何列表中任何节点的标记中的内容。其次,我希望能够使用LINQ查询,但XmlNodeList似乎不支持这种语法。在下面的示例XML中,我希望能够获得由IO_Group_name或mdisk grp_name属性确定的属于特定IO组或mdisk的所有VDisk。我看到的大部分内容都给出了访问[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>

对象
节点只有一个属性:
类型

string type = vdiskNode.Attributes["type"].Value;
属性
节点有两个属性:
名称

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

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

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

或使用LINQ转换为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

vdisknode.attAttributes[]有一个条目。Name的字符串值为“type”,value的sring值为“vdisk”。不过,你的回答确实有帮助。我在vdisknode找到了我想要的。ChildNodes@DavidGreen:我猜
vdisknode.attributes[]
有一个条目,它是
类型
,对吗?所以确实需要子节点(
属性
)的名称和值。@abatischev感谢LINQ的帮助。根据Stackoverflow,我提出了另一个适用于XDocument的版本,但您的版本适用于其他版本。