2017-01-24 4 views
1

Ich möchte mit XPath nur den Wert aus span class = "Wert" ohne das Währungszeichen Zeichen auswählen.Wählen Sie Text ohne Geschwister Markup

<span class="infoValue"> 
<span class="value"> 
<span class="currencyLeft">$</span> 
1000 
</span> 
</span> 

//span[@class='infoValue']//span[@class='value'] 

Mit diesem Xpath kann ich "$ 1000" auswählen. Wie kann ich mit XPath nur die "1000" ohne "$" -Zeichen entfernen oder bekommen?

Wenn ich es versuche.

//span[@class='infoValue']//span[@class='value']/span[not(currencyLeft)]" 

Ich bekomme nur wieder das Währungszeichen "$".

Antwort

1

Es gibt <span> Knoten und Textknoten. Wenn Sie einen Span-Knoten auswählen, erhalten Sie immer das $, da jeder Span-Knoten es enthält und XPath nur vollständige Knoten mit allen ihren Nachkommen auswählt. Aber $ und 1000 sind Textknoten, so können Sie einen von ihnen wählen:

//span[@class='infoValue']/span[@class='value']/text() 

Alternativ können Sie die Spanne als String behandeln und entfernen Sie die Zeichenfolge "$" ("$" a $, nicht die $ in der XML-Datei , da letzterer $ mit einer bestimmten Position/parent/... in der XML-Datei verknüpft ist). Obwohl dies nur für einen einzigen Wert funktioniert:

normalize-space(translate(//span[@class='infoValue']/span[@class='value'], "$", "")) 
+0

Dies wird unerwünschte Leerzeichen aufnehmen, die mit 'normalize-space()' schwer zu trimmen sind, da mehrere Textknoten zurückgegeben werden können. – kjhughes

1
'normalize-space(//span[@class="value"]/text()[normalize-space()])' 
+0

Das funktioniert (+1). Möglicherweise möchten Sie mit einem anderen 'normalize-space()' umbrechen, um alle führenden oder nachfolgenden Leerzeichen um die '1000' zu entfernen. – kjhughes

+0

ja, gute Idee – eLRuLL

+0

Danke an alle. $ x ("normalize-space (// div [enthält (@ class, 'balanceBox')] // span [@ class = 'infoValue'] // span [@ class = 'wert']/text()) ") Ergebnis -" 2.000,00 "- aber wenn ich diesen Xpath in meinem Code verwende, wurde ich immer verursacht durch: java.lang.IllegalArgumentException: erwartet ein Element aber war: zoram

1

Dieser XPath,

normalize-space(//span[@class='currencyLeft']/following-sibling::text()) 

wird

1000 

wählen wie gewünscht.

Sie können natürlich das Erbe /span[@class='currencyLeft'] genauer angeben.

0
substring-after(//span[@class="value"], "$") 

Verwendung substring-after Funktion:

Gibt die Teilzeichenkette des ersten Arguments Zeichenfolge, die den ersten Auftreten des zweiten Arguments Zeichenfolge in dem ersten Argument Zeichenfolge oder die leere Zeichenfolge, wenn die erste folgt Argument String nicht enthält die zweite Argument-Zeichenfolge.

Verwandte Themen