문제
저는 .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는 다음과 같아야합니다. 라코 디스
단일 노드를 선택하면 첫 번째 요소 만 필요합니다.따라서 최상의 솔루션은 다음과 같습니다. 라코 디스