2009-08-07 36 views
8

Tôi có tài liệu xml có phần tử gốc, hai phần tử con, 'chẩn đoán' và 'kết quả'. Phần tử 'results' sau đó có một số phần tử tùy ý với tên 'result'C# XmlDocument SelectNodes

Khi điều này được tải vào XmlDocument, rất dễ điều hướng cấu trúc và thấy rằng đây chính xác là cách hoạt động của nó. Tôi có thể viết một hàm đệ quy để chọn ra tất cả các phần tử "kết quả". Các XmlDocument.SelectNodes ("//kết quả") tìm thấy một nút không có vấn đề.

Tuy nhiên, * XmlDocument.SelectNodes ("// results/result") không tìm thấy gì.
* XmlDocument.SelectNodes ("// result") không tìm thấy gì cả.

Tôi đã nói chuyện với một đồng nghiệp và anh ấy đã đau buồn khi sử dụng Xpath trong XmlDocument.SelectNodes. Bất kỳ ai khác đều gặp phải vấn đề này? Bất kỳ giải pháp?

XML FILE:

<?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 ("Kết quả //") không tạo hit.

+0

Bạn có một mẫu của xml có liên quan không? Có thể các phần tử "kết quả" của bạn thực sự nằm trong một không gian tên khác với các phần tử "kết quả" không? Có bất kỳ tiền tố đủ điều kiện nào trên các phần tử không? –

Trả lời

18

Rob và Câu trả lời của Marc có thể đi đúng hướng - XmlDocument + namespaces + XPath có thể hơi đau.

Nếu bạn có thể sử dụng .NET 3.5, tôi đề nghị bạn sử dụng LINQ to XML để thay thế. Điều đó sẽ làm cho nó thực sự dễ dàng:

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

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

Về cơ bản LINQ to XML là một API vượt trội ở hầu hết mọi phương diện, trong kinh nghiệm của tôi :) (Tôi tin rằng có một số khả năng nó mất tích, nhưng nếu bạn có quyền truy cập vào .NET 3.5 chắc chắn có giá trị ít nhất là cố gắng.)

+0

Cảm ơn Jon, tôi đã chuyển sang LINQ và nó đẹp hơn rất nhiều! :) – Daniel

+0

điều này đã làm nó cho tôi, nhưng đó là phần XNamespace đó là vấn đề của tôi. i * ghét * để cho Jon Skeet thêm bất kỳ điểm nào nữa ... nhưng, ... đuôi dài và tất cả. –

+3

@ John: Nếu đó là bất kỳ sự an ủi nào, upvote của bạn đã không cho tôi thêm đại diện nữa. Tôi đã đạt đến giới hạn đại diện khoảng 9 giờ trước. –

12

Có vẻ như tôi không thích các không gian tên; bạn thường cần phải tranh thủ sự giúp đỡ của một XmlNamespaceManager cho điều này, và sử dụng một bí danh trong các truy vấn của bạn, tức là

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

(nơi x được định nghĩa trong nsmgr như một bí danh cho các không gian tên được)

+0

Cảm ơn Mark, đó là chính xác nó. – Daniel

Các vấn đề liên quan