J'ai un fichier xml sous Linux que je souhaite traiter. J'ai besoin d'obtenir tous les identifiants d'un nœud parent en fonction de ses enfants. Ici, je veux obtenir tous les identifiants de 'a' qui ont 'c' sans la clé "f.g".
<a id="11111"> <b> <c key="d.e">stuff1</c> <c key="f.g">stuff2</c> <c key="j.k">stuff4</c> </b> </a> <a id="22222"> <b> <c key="d.e">stuff1</c> <c key="h.i">stuff3</c> <c key="j.k">stuff4</c> <c key="l.m">stuff5</c> </b> </a> <a id="33333"> <b> <c key="c.d">stuff0</c> <c key="d.e">stuff1</c> <c key="h.i">stuff3</c> <c key="j.k">stuff4</c> <c key="l.m">stuff5</c> </b> </a>
Dans ce cas, je devrais obtenir 22222 et 33333. Je ne sais pas vraiment comment écrire le xpath pour cela.
3 Réponses :
Vous pouvez filtrer par (pas):
//a[[not(@key = 'f.g')]]
Cela vous renverra les éléments 'a' nécessaires, mais je ne sais pas comment obtenir leurs identifiants.
p>
Hmm, j'ai découvert comment obtenir les identifiants mais le "non" ne semble pas fonctionner. Ceci est le xpath que j'essaye actuellement "//a[./b/c[not[@key='f.g'[/.).
veuillez utiliser '(' et ')' à la place de '[' et ']': "//a[.//c[not(@key='f.g') /@id"
Je pense que vous cherchez quelque chose comme:
//a[not(.//c[@key="f.g"])]/@id
qui peut être traduit par: trouver n'importe quel nœud
qui n'a PAS de nœud enfant key
qui lui-même a une valeur d'attribut de "fg".
J'obtiens cette erreur qu'est-ce que cela signifie? Erreur XPath: xmlXPathEval littéral inachevé: échec de l'évaluation Échec de l'évaluation XPath
@aedan Difficile à dire sans voir le xml réel; mais essayons ceci: quelle est exactement la commande xmllint que vous avez utilisée?
La réponse de @Jack Fleeting est probablement la meilleure solution. Comme alternative (plus gourmande):
//c[not(@key="f.g" or preceding-sibling::c[@key="f.g"] or following-sibling::c[@key="f.g"])]/ancestor::a
Recherchez les éléments c
où lui-même, et les frères précédents ou suivants contiennent un attribut différent de @ key = " fg "
. Sélectionnez ensuite leurs ancêtres a
.