2011-10-31 13 views
6

Xin lỗi vì đã làm phiền bạn với một câu hỏi đơn giản như vậy, nhưng tôi đang bị mắc kẹt ở đây từ một giờ:XmlElement.SelectNodes (..) - không tìm thấy gì .. Trợ giúp?

Tôi có một file xml mà trông giống như sau:

<?xml version="1.0" encoding="utf-8"?> 
<aaa xmlns="http://blabla.com/xmlschema/v1"> 

    <bbb> 
    <ccc>Foo</ccc> 
    </bbb> 

    <ddd x="y" /> 
    <ddd x="xx" /> 
    <ddd x="z" /> 

</aaa> 

Tôi đang cố gắng truy cập các yếu tố 'ddd' như thế này:

var doc = new XmlDocument(); 
doc.Load("example.xml"); 
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd")) 
{ 
    // do something 
    Console.WriteLine(dddNode.Attributes["x"].Value); 
} 

Khi chạy vòng lặp foreach bị bỏ qua vì tôi không lấy lại bất kỳ nút nào từ phương thức .SelectNodes. Tôi đã phá vỡ trước vòng lặp và đã xem xét InnerXML, điều đó có vẻ ổn và tôi cũng đã thử tất cả các loại XPath (như "// bbb" hoặc "/ aaa/ddd"), nhưng chỉ "/" dường như không trả lại vô giá trị.

Mã chính xác này đã hoạt động đối với tôi trước đây, hiện tại nó không hoạt động. Tôi nghi ngờ một cái gì đó với tuyên bố không gian tên đó trong thẻ aaa, nhưng tôi không thể tìm ra lý do tại sao điều này sẽ gây ra vấn đề. Hoặc .. bạn có thể thấy bất cứ điều gì tôi có thể bị mất?

Trả lời

10

Đây là xml-không gian tên. Không có ddd. Tuy nhiên, có x:ddd trong đó x là bí danh của bạn là http://blabla.com/xmlschema/v1. Bạn sẽ cần phải thử nghiệm với không gian tên - ví dụ:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1"); 
var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr); 
// nodes has 3 nodes 

Note x ở trên là tùy ý; không có ý nghĩa trong số x ngoài sự tiện lợi.

này (chứ không phải bất tiện) có nghĩa là thêm không gian tên (hoặc một bí danh, như ở trên) vào tất cả các biểu thức xpath của bạn.