Créer des Nœuds XML basé sur XPath?
Quelqu'un sait-il d'un moyen de créer une hiérarchie XML par programmation à partir d'une expression XPath?
Par exemple si j'ai un fragment XML tels que:
<feed>
<entry>
<data></data>
<content></content>
</entry>
</feed>
Compte tenu de l'expression XPath /alimentation/entrée/content/@source, j'aurais:
<feed>
<entry>
<data></data>
<content @source=""></content>
</entry>
</feed>
Je réalise que c'est possible à l'aide de XSLT, mais en raison de la nature dynamique de ce que je suis en train de réaliser un fixe transformation ne fonctionne pas.
Je travaille en C# mais si quelqu'un a une solution à l'aide d'une autre langue s'il vous plaît carillon.
Merci pour l'aide!
- Qu'entendez-vous par "fixe transformation ne fonctionne pas"?
- L'objectif final est que je suis en train de mapper des valeurs dans une base de données à différents endroits à l'intérieur d'un document XML. Dans les cas où la valeur n'existe pas dans la base de données que je ne veux pas créer pertinentes de la hiérarchie.
Vous devez vous connecter pour publier un commentaire.
Dans l'exemple, vous présente la seule chose créée est l'attribut ...
Si ce que vous voulez vraiment est d'être capable de créer une hiérarchie où il n'existe pas alors vous pouvez de votre propre simple analyseur xpath. Je ne sais pas à propos de maintien de l'attribut dans le xpath bien. Je préfère lancer le nœud d'un élément et le point d'amure sur un .SetAttribute comme je l'ai fait ici:
Voici mon petit hack qui peut également créer des attributs aussi longtemps que vous utilisez un format comme
/configuration/appSettings/add[@key='name']/@value
.SplitOnce est une méthode d'extension:
Exemple:
par exemple
Un problème avec cette idée, c'est que xpath "détruit" l'information.
Il y a un nombre infini d'arbres xml qui peut correspondre à de nombreuses requêtes xpath. Maintenant, dans certains cas, comme dans l'exemple que vous donnez, il est évident minimale arbre xml qui correspond à votre xpath, où vous avez un prédicat qui utilise "=".
Mais par exemple si le prédicat n'utilise pas l'égalité, ou de tout autre opérateur arithmétique autres que l'égalité, un nombre infini de possibilités existent. Vous pouvez essayer de choisir un "canonique" de l'arborescence xml qui impose, à dire le moins de bits pour représenter.
Supposons, par exemple, vous avez eu xpath
/feed/entry/content[@source > 0]
. Maintenant, n'importe quel arbre xml de la structure dans laquelle le nœud de contenu a un attribut source dont la valeur a > 0 match, mais il y a un nombre infini de nombres plus grand que zéro. En choisissant la "minimale" de la valeur, sans doute le 1er, vous pouvez tenter de donner une forme canonique votre xml.Xpath prédicats peuvent contenir assez arbitraire des expressions arithmétiques, de sorte que la solution générale à ce est assez difficile, si pas impossible. On pourrait imaginer un énorme équation en y, et il devrait être résolu dans le sens inverse à venir avec des valeurs qui correspondent à l'équation; mais comme il peut y avoir un nombre infini de valeurs correspondantes (tant que c'est vraiment une inégalité pas une équation), une solution canonique devront être trouvés.
De nombreuses expressions d'autres formes également de détruire de l'information. Par exemple, un opérateur comme "ou" toujours détruit de l'information. Si vous savez que
(X or Y) == 1
, vous ne savez pas si X 1, Y 1, ou les deux est 1; tout ce que vous savez pour sûr, c'est que l'un d'eux est de 1! Donc si vous avez une expression à l'aide de OU, vous ne pouvez pas dire lequel des nœuds ou des valeurs qui sont entrées à la OU devrait être de 1 (vous pouvez faire un choix arbitraire et de définir à la fois 1, qui permettra de satisfaire l'expression pour sûr, que les deux choix, un seul d'entre eux est de 1).Supposons maintenant qu'il existe plusieurs expressions xpath qui se réfèrent au même ensemble de valeurs. Ensuite, vous retrouver avec un système d'équations ou d'inéquations qui peut être pratiquement impossible à résoudre. Encore une fois, si vous restreindre à la limite permise de xpath pour un petit sous-ensemble de sa pleine puissance, vous pouvez résoudre ce problème. Je soupçonne entièrement le cas général est similaire à la Turing problème de l'arrêt, cependant, dans ce cas, étant donné un programme quelconque (xpath), figure un ensemble de données cohérentes qui correspond au programme, et il est dans un certain sens minimal.
Voici ma version. Espérons que cette mesure permettrait également d'aider quelqu'un.
La version C# de Mark Miller solution Java
Utilisation
définir
C'est une version améliorée de Christian Peeters solution qui prend en charge les espaces de noms dans l'expression xpath.
Si la requête XPath chaîne est traitée à partir de l'arrière vers l'avant, il est plus facile de traitement de la non enraciné Xpath par exemple. //a/b/c... Il faut le soutien de Gordon syntaxe XPath trop bien que je n'ai pas essayé...
J'avais besoin d'un XNode au lieu d'un XmlNode mise en œuvre, et la RegEx ne fonctionne pas pour moi (parce que les noms d'élément avec . ou - ne sont pas en fonctionnement)
Donc ce qu'est ce qui a fonctionné pour moi:
Ici est une meilleure expression rationnelle basée sur Mark Miller code
Je sais que c'est un très vieux fil ... mais je viens d'essayer la même chose et est venu avec la regex suivante qui n'est pas parfait mais je le trouve plus générique
La chaîne /configuration/appSettings/add[@key='nom']/@value
doit être analysée pour
Trouvé 14 match(es):
start=0, fin=14
Groupe(0) = /configuration
Groupe(1) = configuration
Groupe(2) = null
Groupe(3) = null
Groupe(4) = null
Groupe(5) = null
start=14, fin=26
Groupe(0) = /appSettings
Groupe(1) = appSettings
Groupe(2) = null
Groupe(3) = null
Groupe(4) = null
Groupe(5) = null
start=26, fin=43
Groupe(0) = /add[@key='nom']
Groupe(1) = ajouter
Groupe(2) = [@key='nom']
Groupe(3) = clé
Groupe(4) = nom
Groupe(5) = null
start=43, fin=50
Groupe(0) = /@value
Groupe(1) = null
Groupe(2) = null
Groupe(3) = null
Groupe(4) = null
Groupe(5) = valeur
Qui signifie que nous avons
Groupe(0) = Ignoré
Groupe(1) = Le nom de l'élément
Groupe(2) = Ignoré
Groupe(3) = Filtre d'attribut nom
Groupe(4) = Filtre de valeur de l'attribut
Ici est une méthode java qui peut utiliser le modèle de
}
J'ai aimé Chris version parce qu'elle a manipulé les attributs dans les requêtes xpath et les autres solutions n'ont pas (bien qu'il ne gère pas les "text()" dans le chemin d'accès que bien que j'ai fixé).
J'ai malheureusement eu à l'utiliser dans une application VB, voici donc la conversion pour que: