문제

저는 .NET에서 XPath를 사용하여 다음 라인에 따라 XML 문서를 구문 분석하고 있습니다.

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

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

문제는 XPath 쿼리가 stuffChild 항상 첫 번째 자식을 반환합니다. stuff 요소, 나머지는 절대 아닙니다.개인에 대해 쿼리하는 데 XPath를 사용할 수 없습니까? XMLElement?

도움이 되었습니까?

해결책

// XPath 표현식의 시작 부분은 문서 루트에서 시작됩니다.".//stuffChild"를 시도해 보세요..는 검색 컨텍스트를 설정하는 self::node()의 약어이고 //는 하위 축의 약어입니다.

그래서 당신은:

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

이는 다음과 같이 번역됩니다.

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

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

하위 노드가 상위 노드와 동일한 이름을 가질 수 있는 경우 다음과 같은 약간 더 자세한 구문을 사용하여 상위 노드를 다시 선택하지 않도록 할 수 있습니다.

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

또한 "stuffChild"가 "stuff"의 직계 자손인 경우 접두사를 완전히 생략하고 "stuffChild"만 선택할 수 있습니다.

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

그만큼 W3학교 튜토리얼에는 이해하기 쉬운 형식으로 유용한 정보가 있습니다.

다른 팁

// 앞에 사용하는 stuffChild는 루트에서 시작하여 stuffChild 요소를 찾고 있음을 의미합니다.

현재 노드 (현재 노드의 하위 항목)에서 시작하려면 다음과 같이 .//를 사용해야합니다. 라코 디스

"stuffChild"가 "stuff"의 하위 노드 인 경우 xpath는 다음과 같아야합니다. 라코 디스

단일 노드를 선택하면 첫 번째 요소 만 필요합니다.따라서 최상의 솔루션은 다음과 같습니다. 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top