2012-03-14 6 views
0

가능한 중복 :
Get the depth of an Item어떻게 노드의 깊이를 얻을 수

이 같은 XML을 가지고

<Parent> 
    <child>test</child> 
    <child> 
     <child>test2</child> 
    </child> 
    <child> 
     <child> 
      <child>test3</child> 
     </child> 
    </child> 
</Parent> 

어떻게 이들 각각의 레벨을 얻을 수 있습니다 linq to xml을 사용하는 항목

leve l 테스트 = 1 테스트 2 수준 2 수준 3 테스트 3 = 3

얼마나 많은 노드가 있는지 또는 얼마나 많은 수준이 될지 전혀 알지 못합니다. 이 재귀 함수로 작성할 수 있지만 XML linq 더 나은 뭔가를 제공 할 수도 있습니다 생각했다.

+0

s/ASP.NET/.NET/태그 : ASP.NET에 대한 정보는 없습니다. – Richard

답변

2

xpath를 사용하여 노드 레벨을 계산할 수 있습니다. 예 :

var element = d.XPathSelectElement("Parent/child/child/child"); 
var level = element.XPathSelectElements("ancestor::*").Count(); 

편집 : 다음 <child>test3</child>에 대한

var level = (double)element.XPathEvaluate("count(ancestor::*)"); 

이 그들에게

을 절약 할 수 물론 당신이 사용할 수 있습니다 @Richard 주석의 XElement 인스턴스를 인스턴스화하지 않고 부모 노드를 계산하기 위해 제안 Ancestors() (다른 대답에서 제안 된대로) 노드의 조상 요소 컬렉션을 가져 와서 계산합니다.

var level = element.Ancestors().Count(); 

이렇게하면 동일한 결과가 나타납니다.

+1

'level = element.XPathEvaluate ("count (ancestor :: *)") int로 제안 할 것입니다 : 이것은 XElement 인스턴스를 인스턴스화하여 저장 한 후에 저장합니다. – Richard

+0

@ 리차드, 훌륭한 제안에 감사드립니다. 이것이 최고의 해결책 인 것 같습니다. 유일하게 반환되는 표현식의 타입은'int'가 아닌'double'입니다. – Alex

+0

XSLT의 모든 수치가 부동 소수점이기 때문에 반환 값이 두 배가되지만 분명히 count의 결과는 정수 값이어야합니다. 아마도 명시 적 변환을 포함하도록 캐스트를 선호 했어야합니다 :-). – Richard

관련 문제