Comment garder des commentaires lors de l'analyse syntaxique XML à l'aide de Python / ElementTree
Actuellement à l'aide de Python 2.4.3, et pas le droit de mise à niveau
Je veux modifier les valeurs d'un attribut donné dans un ou plusieurs tags, avec XML-les commentaires dans le fichier mis à jour.
J'ai réussi à créer un script Python qui prend un fichier XML, comme argument, et pour chaque balise spécifiée modifie un attribut, comme indiqué ci-dessous
def update(file, state):
global Etree
try:
from elementtree import ElementTree
print '*** using ElementTree'
except ImportError, e:
print '***'
print '*** Error: Must install either ElementTree or lxml.'
print '***'
raise ImportError, 'must install either ElementTree or lxml'
#end try
doc = Etree.parse(file)
root = doc.getroot()
for element in root.findall('.//StateManageable'):
element.attrib['initialState'] = state
#end for
doc.write(file)
#end def
C'est toute fine, les attributs "initialState" sont mis à jour, sauf pour le fait que mon fichier XML contient beaucoup de commentaires XML en tant que bien, mais ils ont disparu depuis longtemps, ce qui est mauvais.
Suspect qui analysent uniquement récupère le XML de la structure, mais j'ai pensé XML-commentaires où une partie de la structure. Je me rends compte que le "lisible" formatage de mon document original a disparu depuis longtemps, mais que j'ai réalisé est le comportement attendu, besoin de formater par la suite en utilisant xmllint --format
ou XSL.
vous misez, j'ai eu un moment difficile lors de la création de mon premier scripts réalisant que tous, les bonnes choses, j'ai trouvé des exemples de a été de 2.7 🙂
OriginalL'auteur rhellem | 2010-12-17
Vous devez vous connecter pour publier un commentaire.
Je sais c'est vieux maintenant, mais je suis tombé sur cette réponse ci-dessus sur la façon de conserver des commentaires. De Frederik les instructions publiées par sur la façon de mettre des commentaires dans l'arbre fonctionne toujours avec les versions actuelles de ElementTree, mais n'est plus que nécessaire pour mon utilisation, au moins. Il enveloppe le XML dans un élément, qui n'est pas souhaitable pour moi. Je n'ai pas besoin d'instructions de traitement préservé, mais seulement les commentaires. Donc, j'ai coupé le bas de la classe, il a fourni sur le site:
Pour l'utiliser, créez une instance de cet objet comme un "analyseur" et ensuite de le passer en paramètre à ElementTree.parse() comme ceci:
Je ne prends pas de crédit que ce soit pour le code ou pour les sans-papiers de l'utilisation de ElementTree, mais ça marche pour moi, en ne conservant que les commentaires sans affecter la structure du document original. Et de noter que toute modification future de ElementTree (semble peu probable à ce stade, après toutes ces années, si) rompre cette.
lxml
pour cela et d'essayer de l'obtenir pour fonctionner. Je suis de l'importation defrom lxml import etree as et
. Je pense que je peux remplacerself._parser
avecet
, mais ne peut pas comprendre ce qu'il faut utiliser à la place deself._target
. Pouvez-vous aider?Cela ne fonctionne pas pour python3 (testé avec la v3.5.4) que l'api a changé. Voir ici pour python3 solution.
OriginalL'auteur Jon Thomason