3

今日、私は新しいプロジェクトを見るように頼まれました-いくつかのXMLを読み、いくつかの分析を行います。私は少しC#を知っています。私はこれまでのところ機能するこのコードでこれまでに到達しました。4つのノードリストを正常に取得しました。いくつか問題があります。まず、リストのいずれかのノードのタグにあるものにアクセスする方法がわかりません。次に、LINQクエリを使用できるようにしたいと思いますが、XmlNodeListはその構文をサポートしていないようです。以下のサンプルXMLでは、io_group_nameまたはmdisk_grp_nameプロパティによって決定される特定のIOグループまたはmdiskに属するすべてのvdiskを取得できるようにしたいと思います。私が見たもののほとんどは、[属性]リストにアクセスするための例を示し、交換されたすべての使用済みプロパティ/属性を検索します。

私が試したのも以下のとおりです。null値の例外が発生しました。属性リストには属性が1つだけあります。やりたいことを実行するための例が見つかりません。また、デバッガーでノードを調べても、やりたいことを実行するためにアクセスする必要があるものが明確ではありません。

//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ノードには1つの属性しかありません:type

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

propertyノードには2つの属性があります:namevalue

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

私が考える必要があるのは、XPathクエリを拡張することです。

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

または、LINQtoXMLを使用します。

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 に答える