2013-07-24 6 views
5

Ich habe ein Problem"Ausdruck muss zu einem Knotensatz ausgewertet werden."

Meine XML-Datei ist hier;

<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> 

Wie werde ich analysieren diese XML-Datei

ich so codiert, aber ich habe Nachricht einen Parse-Fehler;

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

Antwort

12

Grund für den Fehler

Gemäss der Fehlermeldung, erfordert, dass die .SelectNodes()xpath String-Parameter auf einen Knotensatz auswertet, z.B. Diese XPath wird eine XmlNodeList mit 3 Knoten zurückgeben:

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

eine xpath liefert, die einen einzelnen Knoten zurückgibt, ist auch akzeptabel, - das zurück XmlNodeList wird nur einen einzigen Knoten haben:

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

Es ist jedoch nicht möglich, nicht-Knotenwerte, wie skalare Ausdrücke zurück:

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

Error: Expression must evaluate to a node-set.

Statt für XmlDocument, müssten Sie einen Navigator erstellen, um einen Ausdruck kompilieren, und auswerten:

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

Wenn Sie Ihre XML-Switch-Stack Parsen verwenden XmlDocument zu einem Linq to XmlXDocument gibt es eine much more concise way zu bewerten skalare Ausdrücke:

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

Badly Xpath gebildet

Derselbe Fehler (Expression must evaluate to a node-set) wird auch häufig für xpath s zurück, die

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

Error: Expression must evaluate to a node-set.

OPs Frage

Sie völlig ungültig sind, haben einen Fehler in Ihrer XPath. Was Sie wahrscheinlich wollen, ist dies:

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

, die das ALIS Kind des DOVIZ Elements zurück, das ein ADI Kind mit einem Wert von dovizKuru2 hat (die vermutlich eine Variable für Währung ist wie USD)

+0

es funktioniert. Danke. – ofince

+2

Eigentlich ist 'Some/Really = schlecht [@ formed = 'xpath']' syntaktisch gültig und gibt einen booleschen Wert zurück. Wenn Sie es durch 'A/B = C [@ X = 3]' ersetzen, können Sie sehen, dass es vollkommen sinnvoll ist. –

+0

Danke @MichaelKay - habe aktualisiert – StuartLC

Verwandte Themen