2017-06-16 2 views
1

Ich versuche, die Namen mehrerer Elemente zu drucken, aber ich kann nur XPath dazu überreden, eins auszugeben.Mehrere übereinstimmende Elementnamen drucken

Vor diesem XML:

<xml> 
    <foob>931</foob> 
    <arba>478</arba> 
    <zfoo>892</zfoo> 
</xml> 

Ich versuche, diese und bekommen foob:

name(//*[contains(name(), "foo")]) 

Ich versuche, diese und eine Fehlermeldung über einen ungültigen Ausdruck erhalten:

//*[contains(name(), "foo")]/name() 

Obwohl diese funktioniert gut:

//*[contains(name(), "foo")]/text() 

Ich bin auf der Kommandozeile und habe sowohl xmllint als auch xpath (aus Perls XML-XPath-Modul) mit den gleichen Ergebnissen versucht.

Wie kann ich sowohlfoob und zfoo zurückgegeben bekommen?

Antwort

2

Mit XPath 1.0, Ihre erste XPath,

name(//*[contains(name(), "foo")]) 

Ergebnisse in nur "foob" weil XPath 1.0 Pässe nur das erste Element des ausgewählten nodeset zu name(). Um eine Liste von "foob" und "zfoo" zu erhalten, würden Sie über den ausgewählten nodeset in der Sprache durchlaufen müssen, um den XPath-Call-Hosting - XSLT, Python, Java usw.

Mit XPath 2.0, Ihre zweite XPath,

//*[contains(name(), "foo")]/name() 

gut funktionieren würde eine Liste von "foob" und "zfoo" direkt über XPath allein zu erhalten.

+0

Ok, mir war nicht bewusst, dass die zweite XPath 2.0 war; anscheinend gibt es nicht viele CLI-Parser, die dies unterstützen. Muss etwas in Python oder PHP schreiben. Vielen Dank! – miken32

Verwandte Themen