2008-08-25 4 views
11

내가 XML 문서를 구문 분석 .NET에서 XPath를 사용하고, 선택 :XPath와의 라인을 따라 단일 노드

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff"); 

foreach (XmlNode stuff in lotsOStuff) { 
    XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild"); 
    // ... etc 
} 

문제는 stuffChild에 대한 XPath를 쿼리는 항상의 자식을 반환하는 것입니다 첫 번째는 stuff 요소이며 나머지는 절대로 사용하지 마십시오. XPath를 개별 쿼리에 사용하지 마십시오 XMLElement?

답변

10

//은 XPath 표현식의 시작 부분에서 문서 루트에서 시작합니다. ".//stuffChild"를 시도하십시오. . self :: node()는 검색 컨텍스트를 설정하고 //는 하위 축을 나타내는 축약어입니다. 그래서

당신은 :

로 변환
XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild"); 

:

이 xmlNode stuffChild = stuff.SelectSingleNode ("자기 :: 노드()/자손 :: stuffChild"); 부모와 같은 이름을 가질 수있는 자식 노드, 당신은 당신이하지 않도록, 다음에 조금 더 자세한 구문을 사용하고자 할 경우

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild"); 

부모를 다시 선택 :

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild"); 

또한 "stuffChild"는 "물건"의 직계 후손 인 경우, 당신은 완전히 접두어를 생략하고 그냥 "stuffChild"를 선택할 수 있습니다.

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 

W3Schools 튜토리얼 형식을 소화 할 수있는 쉬운에 도움이 정보를 가지고 있습니다.

+0

.//foo는 ** descendant :: foo와 같지 않으며 일반적으로 ** 잘못된 ** 자손 노드를 선택하는 방법입니다. http://stackoverflow.com/questions/453191/ –

+0

을 참조하십시오. 다음 XPath의 컨텍스트를 설정하는. –

+0

// 약어에 대한 설명서를 참조하십시오. .//foo는 self :: node()/descendant-or-self :: node()/child :: stuffChild로 변환됩니다. –

2

앞에 사용하면 stuffChild 요소를 루트에서부터 찾고 있음을 의미합니다.

현재 노드에서 (현재 노드의 자손 만)를 시작하려는 경우와 같이, .//을 사용해야합니다

stuff.SelectSingleNode(".//stuffChild"); 
1

"stuffChild은"다음, "물건"의 자식 노드 인 경우 귀하의 xpath는 다음과 같아야합니다.

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild"); 
-1

단일 노드를 선택하면 첫 번째 요소 만 필요합니다. 그래서, 가장 좋은 해결책은 다음과 같습니다.

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]"); 
관련 문제