2009-08-07 4 views
8

루트 요소, 두 개의 자식 요소 인 '진단'및 '결과'가있는 XML 문서가 있습니다. 'results'요소는 'result'라는 이름의 임의의 수의 요소를 갖습니다.C# XmlDocument SelectNodes

XmlDocument로로드 될 때 구조를 탐색하기 쉽고 이것이 작동하는 방식을 정확히 볼 수 있습니다. 모든 "결과"요소를 선택하는 재귀 함수를 작성할 수 있습니다. XmlDocument.SelectNodes ("// results")는 아무런 문제가없는 노드를 찾습니다.

그러나 * XmlDocument.SelectNodes ("// results/result")는 아무 것도 찾지 않습니다.
* XmlDocument.SelectNodes ("// result")는 아무 것도 찾지 않습니다.

저는 동료와 이야기를 나눴으며 XmlDocument.SelectNodes에서 Xpath를 사용하여 슬픔을 겪었습니다. 다른 누구라도 이런 종류의 문제에 부딪 혔습니까? 어떤 해결책?

XML 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2009-08-07T10:19:59Z" yahoo:lang="en-US" yahoo:updated="2009-08-07T10:19:59Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+search.news+where+query%3D%22Tanzania%22"> 
    <diagnostics> 
     <publiclyCallable>true</publiclyCallable> 
     <url execution-time="47"><![CDATA[http://boss.yahooapis.com/ysearch/news/v1/Tanzania?format=xml&start=0&count=10]]></url> 
     <user-time>49</user-time> 
     <service-time>47</service-time> 
     <build-version>2579</build-version> 
    </diagnostics> 
    <results> 
     <result xmlns="http://www.inktomi.com/"> 
      <abstract>Kakungulu Cup winners SC Villa face Tanzania’s Simba SC this afternoon at the National stadium in Dar es salaam. “We had a very tiresome journey. The road was so bad and the road blocks were so many. However, we finally reached but the boys were so tired,” said Kato.</abstract> 
      <clickurl>http://lrd.yahooapis.com/_ylc=X3oDMTQ4cXAxcnRoBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA21VVGlta2dlQXUzeEYuM0xGQkQzR1pUU1FIS0dORXA4cUk4QUJJX1U-/SIG=12vhpskdd/**http%3A//www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</clickurl> 
      <date>2009/08/07</date> 
      <language>english</language> 
      <source>The Monitor</source> 
      <sourceurl>http://www.monitor.co.ug/</sourceurl> 
      <time>20:22:32</time> 
      <title>SC Villa face Simba in Tanzania</title> 
      <url>http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</url> 
     </result> 

XPATH

doc.SelectNodes ("// 결과")에는 안타를 생산하지 않습니다.

+0

관련 xml 샘플을 가지고 있습니까? "result"요소가 실제로 "results"요소와 다른 네임 스페이스에있을 가능성이 있습니까? 요소에 대한 접두어가 있습니까? –

답변

18

롭 (x가 주어진 네임 스페이스에 별칭으로 nsmgr에 정의 된 경우) 및 마크의 대답은 아마도 올바른 방향으로 가고 있습니다. XmlDocument + 네임 스페이스 + XPath는 약간의 고통이 될 수 있습니다.

.NET 3.5를 사용할 수 있다면 XML 대신 LINQ를 사용하는 것이 좋습니다. 즉, 정말 쉽게 것 : 나는 실종 몇 가지 기능이있다 생각 (:) XML에

XDocument doc = XDocument.Load("foo.xml"); 
XNamespace ns = "bar"; 
var results = doc.Descendants(ns + "result"); 

foreach (var result in results) 
{ 
    ... 
} 

기본적으로 LINQ 내 경험에서, 거의 모든면에서 우수한 API,하지만 당신은에 액세스 할 수있는 경우 닷넷 3.5 그것은 적어도 시도해 볼만한 가치가 있습니다.)

+0

감사합니다. Jon, 나는 LINQ로 전환했는데 훨씬 더 좋았습니다! :) – Daniel

+0

이것은 나를 위해 그것을했다. 그러나 그것은 나의 문제이었던 XNamespace 부분이었다. Jon Skeet에게 더 이상의 점수를주기는 싫지만 .. 긴 꼬리와 모두. –

+3

@ 존 : 어떤 위안이라면, 당신의 업보트가 더 이상 담당자를주지 못했습니다. 약 9 시간 전에 담당자 캡에 도달했습니다. –

12

네임 스페이스가 내게 들리는 것 같습니다. 당신이 일반적으로,이에 대한 XmlNamespaceManager의 도움을 입대하고 쿼리에 별칭을 사용해야 즉

doc.SelectNodes("//x:results/x:result", nsmgr); 

+0

고마워, 정확히 그랬다. – Daniel