2013-07-24 44 views
5

Tôi gặp sự cố"Biểu thức phải đánh giá thành bộ nút".

Tệp XML của tôi ở đây;

<altinkaynak> 

    <DOVIZ> 
    <ADI>Tarih</ADI> 
    <ALIS>24.07.2013 18:59:45</ALIS> 
    <SATIS/> 
    </DOVIZ> 
    <DOVIZ> 
     <ADI>USD</ADI> 
     <ALIS>1.9120</ALIS> 
     <SATIS>1.9220</SATIS> 
    </DOVIZ> 
    <DOVIZ> 
     <ADI>EUR</ADI> 
     <ALIS>2.5280</ALIS> 
     <SATIS>2.5430</SATIS> 
    </DOVIZ> 
</altinkaynak> 

Làm sao tôi phân tích tập tin XML này

tôi mã hóa theo cách đó nhưng tôi nhận được một thông báo lỗi phân tích cú pháp;

if (tip == DövizKuruTipi2.Alış) 
Line 44: return Decimal.Parse(doc.SelectNodes("//ALTINKAYNAK/DOVIZ/ADI=" + dovizKuru2 + "/ALIS")[0].InnerText.Replace('.', ',')); 

Expression must evaluate to a node-set

Trả lời

12

Lý do cho Lỗi

Theo thông báo lỗi, .SelectNodes() đòi hỏi rằng các tham số xpath chuỗi để đánh giá một bộ nút, ví dụ xpath này sẽ trả về một XmlNodeList chứa 3 nút:

var nodeSet = document.SelectNodes("/altinkaynak/DOVIZ"); 

Cung cấp một xpath mà trả về một nút duy nhất cũng là chấp nhận được - sự trở lại XmlNodeList sẽ chỉ có một nút duy nhất:

var nodeSet = document.SelectNodes("(/altinkaynak/DOVIZ)[1]"); 

Tuy nhiên, nó là không thể trả lại các giá trị không phải nút, chẳng hạn như biểu thức vô hướng:

var nodeSet = document.SelectNodes("count(/altinkaynak/DOVIZ)"); 

Error: Expression must evaluate to a node-set.

Thay vì cho XmlDocument, bạn sẽ cần phải tạo ra một hoa tiêu, biên dịch một biểu thức, và đánh giá nó:

var navigator = document.CreateNavigator(); 
var expr = navigator.Compile("count(/altinkaynak/DOVIZ)"); 
var count = navigator.Evaluate(expr); // 3 (nodes) 

Nếu bạn chuyển Xml của bạn phân tích cú pháp ngăn xếp từ việc sử dụng XmlDocument đến một Linq to XmlXDocument có một much more concise way để đánh giá biểu thức vô hướng:

var count = xele.XPathEvaluate("count(/altinkaynak/DOVIZ)"); 

Badly hình thành XPath

lỗi tương tự này (Expression must evaluate to a node-set) cũng thường được trả về cho xpath s mà không có giá trị hoàn toàn

var nodeSet = document.SelectNodes("{Insert some really badly formed xpath here!}"); 

Error: Expression must evaluate to a node-set.

OP của Câu hỏi

Bạn có một lỗi trong XPath của bạn. Những gì bạn có thể muốn là thế này:

doc.SelectNodes("//ALTINKAYNAK/DOVIZ[ADI='" + dovizKuru2 + "']/ALIS") // ... 

đó sẽ trả lại con ALIS của phần tử DOVIZ trong đó có một con ADI với một giá trị của dovizKuru2 (mà có lẽ là một biến cho tệ như USD)

+0

nó công trinh. cảm ơn bạn. – ofince

+2

Trên thực tế 'Một số/Thực sự = xấu [@ hình thành = 'xpath']' là cú pháp hợp lệ và trả về một boolean. Nếu bạn thay thế nó bằng 'A/B = C [@ X = 3]' bạn có thể thấy rằng nó có ý nghĩa hoàn hảo. –

+0

Cảm ơn @MichaelKay - đã cập nhật – StuartLC

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