1
votes

Obtenir la valeur d'attribut des parents si l'enfant n'a pas de valeur d'attribut spécifique

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.


0 commentaires

3 Réponses :


1
votes

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>


2 commentaires

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"



1
votes

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 qui lui-même a un attribut appelé key qui lui-même a une valeur d'attribut de "fg".


2 commentaires

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?



1
votes

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 .


0 commentaires