2014-01-20 2 views
1

이 질문의 변형은 이미 요청되었지만 내가 가지고있는 문제로 저를 도울 수있는 하나를 찾지 못했습니다.XML에서 Linq에 속성 값이있는 자식 노드 가져 오기

감안할 때이 형식의 XML 파일 :

<TopLevel> 
    <SecondLevel Name="Name" Color="Blue"> 
     <ChildNode1></ChildNode1> 
     <ChildNode2></ChildNode2> 
    </SecondLevel> 
    <SecondLevel Name="Name2" Color="Red"> 
     ... 
    </SecondLevel> 
</topLevel> 

내가 속성 색상의 값을 가지고있다. 내가 원했던 것은 먼저 해당 색상에 해당하는 Name을 찾은 다음 모든 하위 노드를 찾을 수있게하는 것입니다.

저는 XDocument보다 Xelement를 사용하는 것을 선호합니다.

이것은 지금까지 시도했지만 행운이 없습니다.

그 결과, 필자는 결국 데이터 테이블로 포맷하려고합니다. 이게 가능합니까?

답변

2

문자열에 속성의 캐스트가 누락되었습니다 (또는 값을 직접 가져 오는 것 - 끝에있는 메모 참조). el.Attribute("Color").Value 직접 또한 수 액세스 속성 값을하지만, 요소 Color 속성이없는 경우 그 예외가 발생합니다 :

XElement xelement = XElement.Load("XmlFile.xml"); 
IEnumerable<string> names = 
      from el in xelement.Elements("SecondLevel") 
      where (string)el.Attribute("Color") == "Red" // here 
      select (string)el.Attribute("Name"); 

참고 : 또한 당신은 XElements 대신 문자열의 순서를 가지고 Name 속성 값을 선택할 수 있습니다. 따라서 캐스팅은 더 안전하지만 xml이 유효하지 않은 경우 코드가 빨리 실패하기를 원하면 값에 액세스하는 것이 옵션 일 수 있습니다.

BTW 당신은 ​​또한 색상 요구 한 두 번째 수준 요소를 얻기 위해 XPath를 사용할 수는 이름의 색과 관련된 속성,하지만 난의 자식 노드를 원한다면 무엇을 발견하기 때문에

IEnumerable<XElement> secondLevels = 
     xelement.XPathSelectElements("SecondLevel[@Color='Red']"); 
+0

이 큰 인' SecondLevel'node? –

+1

@moalaz 그러면 코드를 그대로 둡니다. Name 속성 값에 투영하지 않고'select el' 만 입력하면됩니다. 따라서 XElements 시퀀스가 ​​ –

+0

Perfect! 누구든지 dataTable에 childnodes를 삽입하는 쉬운 방법을 알고 있습니까? –