2010-11-11 10 views
22

Sto cercando di trovare tutti gli attributi di un elemento che corrispondono a un determinato modello.Trova i nomi degli attributi che iniziano con un determinato motivo

Così, per un elemento

<element s2="1" name="aaaa" id="1" /> 
<element s3="1" name="aaaa" id="2" /> 

Vorrei essere in grado di trovare tutti gli attributi che iniziano con 's' (restituzione del valore di s1 per il primo elemento e s3 per il valore del secondo elemento).

Se questo è fuori dall'abilità di xpath, fatemelo sapere.

risposta

35

Uso:

element/@*[starts-with(name(), 's')] 

Questa espressione XPath seleziona tutti i nodi atribute il cui nome inizia con la stringa 's' e che sono attributi di elementi denominati element che sono figli del nodo corrente.

starts-with() è una funzione standard in XPath 1.0

+0

Grazie mille per la risposta, questa è anche una buona risposta. – Dunderklumpen

+0

Funziona come pubblicizzato e mi ha aiutato a far funzionare anche la risposta originale. – Dunderklumpen

+0

Questo era esattamente quello che stavo cercando! Grazie per la domanda e una risposta. :) – ParagJ

3
element/@*[substring(name(), 1,1) = "s"] 

corrisponderà a qualsiasi attributo che inizia con "s".

La funzione starts-with() potrebbe apparire meglio che usare substring()

+0

Hmmm che usa questo in XMLSpy, che è la mia applicazione go-to per Xpath, sto ricevendo un errore "Token inaspettato -" [substring (name(), 1,1) = ". – Dunderklumpen

+0

Questo sembra decisamente l'approccio di cui ho bisogno così tante grazie per la risposta. – Dunderklumpen

+0

Grazie a Dimitrie il seguente modello di sottostringa funziona anche con l'elemento/@ * [sottostringa (name(), 1,1) = 's'] – Dunderklumpen

0

Ho testato le risposte date da entrambi @ Dimitre-Novatchev e @Ledhund, utilizzando il modulo lxml.html in Python.

Sia element/@*[starts-with(name(), 's')] e element/@*[substring(name(), 1,1) = "s"] ritorno solo i valori di s2 e s3. Non sarai in grado di sapere quale valore appartiene a quale attributo.

Penso che in pratica sarei più interessato a trovare gli elementi stessi che contengono gli attributi dei nomi che iniziano con caratteri specifici anziché solo i loro valori.

Per farlo è molto semplice, basta aggiungere /.. alla fine,

element/@*[starts-with(name(), "s")]/..

o

element/@*[starts-with(name(), "s")]/parent::*

o

element/@*[starts-with(name(), "s")]/parent::node()

Problemi correlati