2012-10-18 3 views
3

나는 XML을 읽고 분석을하는 새로운 프로젝트를 보도록 요청 받았다. 나는 C#을 조금 안다. 지금까지이 코드를 사용하여이 코드를 작성했습니다. 나는 4 개의 노드리스트를 성공적으로 얻는다. 나는 몇 가지 문제가있다. 먼저 목록 중 하나의 노드에있는 태그에 액세스하는 방법을 모르겠습니다. 둘째, LINQ 쿼리를 사용할 수 있지만 XmlNodeList는 해당 구문을 지원하지 않는 것 같습니다. 아래의 샘플 XML에서 io_group_name 또는 mdisk_grp_name 속성에 의해 결정된 특정 IO 그룹 또는 mdisk에 속한 모든 가상 디스크를 가져올 수 있기를 바랍니다. 내가 보았던 대부분은 [Attribute] 목록에 액세스하는 예제를 제공하고 사용 된 모든 속성/atttributes를 검색했습니다.독서 <property> 태그

내가 시도한 것은 또한 아래에있다, 그것은 null 값 예외를 줬다. 속성 목록에는 하나의 속성 만 있습니다. 내가 원하는 것을하기위한 예제를 찾을 수 없으며 디버거의 노드를 검사하여 내가 원하는 것을 수행하기 위해 액세스해야하는 것이 명확하지 않다.

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

object 노드는 하나의 속성이 있습니다 type

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

property 노드는 두 가지 속성이 있습니다 namevalue :

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

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

또는 XML에 LINQ를 사용 : 당신은 내가 간주 할 필요가있는 무엇 16,


는 XPath 쿼리를 확장하는 것이다

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 
+0

vdisknode.Atttributes [] 하나의 항목이 있습니다. 이름의 문자열 값이 "유형"이고 값의 문자열 값이 "vdisk"입니다. 당신의 대답은 도움이되었습니다. 나는 내가 원하는 것을 vdisknode에서 찾았습니다. 자식 노드 –

+0

@DavidGreen :'vdisknode.Atttributes []'에는 하나의 항목이 있으며'type'입니까, 맞습니까? 그래서 네, 정말로 하위 노드의 ('property') 이름과 값이 필요합니다. – abatishchev

+0

@abatischev는 LINQ를 도와 주셔서 감사합니다. Stackoverflow 당 XDocument에 대해 작동하는 또 다른 버전을 생각해 냈지만, 당신은 다른 것을 위해 작동 할 것입니다. –