Analyse XML avec Python et minidom
Je suis à l'aide de Python (minidom) pour analyser un fichier XML qui imprime une structure hiérarchique qui ressemble à quelque chose comme ceci (l'indentation est utilisé ici pour montrer l'importante relation hiérarchique):
My Document
Overview
Basic Features
About This Software
Platforms Supported
Au lieu de cela, le programme effectue une itération à plusieurs reprises sur les nœuds et produit ce qui suit, l'impression de nœuds dupliqués. (Regardant la liste des nœuds à chaque itération, il est évident pourquoi il fait cela, mais je n'arrive pas à trouver un moyen d'obtenir la liste de noeud, je suis à la recherche d'.)
My Document
Overview
Basic Features
About This Software
Platforms Supported
Basic Features
About This Software
Platforms Supported
Platforms Supported
Voici le fichier source XML:
<?xml version="1.0" encoding="UTF-8"?>
<DOCMAP>
<Topic Target="ALL">
<Title>My Document</Title>
</Topic>
<Topic Target="ALL">
<Title>Overview</Title>
<Topic Target="ALL">
<Title>Basic Features</Title>
</Topic>
<Topic Target="ALL">
<Title>About This Software</Title>
<Topic Target="ALL">
<Title>Platforms Supported</Title>
</Topic>
</Topic>
</Topic>
</DOCMAP>
Voici le programme Python:
import xml.dom.minidom
from xml.dom.minidom import Node
dom = xml.dom.minidom.parse("test.xml")
Topic=dom.getElementsByTagName('Topic')
i = 0
for node in Topic:
alist=node.getElementsByTagName('Title')
for a in alist:
Title= a.firstChild.data
print Title
J'ai pu résoudre le problème par pas de nidification 'Sujet' éléments, en changeant le niveau inférieur des noms de rubrique à quelque chose comme "SubTopic1" et "SubTopic2'. Mais, je veux profiter de XML intégré structuration hiérarchique sans avoir besoin de différents noms d'élément; il semble que je devrais être capable de nid 'Sujet' éléments et qu'il doit y avoir un moyen de connaître le niveau de "Sujet", je suis actuellement à la recherche à.
J'ai essayé un certain nombre de différentes fonctions XPath sans beaucoup de succès.
source d'informationauteur hWorks
Vous devez vous connecter pour publier un commentaire.
getElementsByTagName est récursive, vous aurez tous descendants avec un correspondant tagName. Parce que vos Sujets contiennent d'autres Sujets qui ont également des Titres, l'appel sera de la partie inférieure en bas des Titres à de nombreuses reprises.
Si vous voulez poser pour tous les enfants directs uniquement, et vous n'avez pas XPath disponibles, vous pouvez créer un filtre, par exemple.:
Permettez-moi de mettre ce commentaire ici ...
Merci pour la tentative. Il n'a pas de travail mais il m'a donné quelques idées. Les ouvrages suivants (la même idée générale; FWIW, le nodeType est ELEMENT_NODE):
Vous pouvez utiliser les éléments suivants générateur de courir à travers la liste et obtenir des titres avec des niveaux d'indentation:
Si vous testez avec votre fichier:
vous obtiendrez une liste avec les tuples suivants:
C'est seulement une idée de base pour être affiné, bien sûr. Si vous voulez juste les espaces au début, vous pouvez code directement dans le générateur, mais avec le niveau que vous avez plus de souplesse. Vous pouvez également détecter le premier niveau automatiquement (ici c'est juste un mauvais travail de l'initialisation du niveau à -1...).
Je pense que cela peut aider
De sortie:
Recusive fonction:
Votre xml:
De la sortie souhaitée: