2010-03-25 3 views
0

xml Étant donné qui ressemble à ceci:document XML en cours d'analyse en tant qu'élément unique au lieu de la séquence de noeuds

<Store> 
<foo> 
<book> 
<isbn>123456</isbn> 
</book> 
<title>XYZ</title> 
<checkout>no</checkout> 
</foo> 
<bar> 
<book> 
<isbn>7890</isbn> 
</book> 
<title>XYZ2</title> 
<checkout>yes</checkout> 
</bar> 
</Store> 

Je reçois cela comme mon xmldoc analysable:

>>> from xml.dom import minidom 
>>> xmldoc = minidom.parse('bar.xml') 
>>> xmldoc.toxml() 
u'<?xml version="1.0" ?><Store>\n<foo>\n<book>\n<isbn>123456</isbn>\n</book>\n<t 
itle>XYZ</title>\n<checkout>no</checkout>\n</foo>\n<bar>\n<book>\n<isbn>7890</is 
bn>\n</book>\n<title>XYZ2</title>\n<checkout>yes</checkout>\n</bar>\n</Store>' 

est-il un moyen facile de pré-traiter ce document de sorte que lorsqu'il est analysé, il n'est pas analysé comme un seul élément xml?

+0

Si le XML semble familier, c'est parce que je l'ai arraché à une autre question de StackOverflow. Toutes mes excuses à la source originale. –

+0

ne savez pas ce que vous voulez faire - l'appel .toxml() n'est-il pas en train de produire un fichier texte? Je pense que la sortie ci-dessus est ce que vous attendez de .toxml(). Comment se fait-il que vous lisiez un fichier xml et que vous reproduisiez un document XML immédiatement? Veux-tu faire ça entre? – fastmultiplication

Répondre

2

Un document XML a toujours un seul élément racine. Si vous ne vous souciez pas de l'élément racine, ignorez-le et regardez plutôt ses enfants!

Par exemple, en utilisant le plus moderne élément arbre (mais minidom offre des possibilités similaires à cet égard):

try: 
    import xml.etree.cElementTree as et 
except ImportError: 
    import xml.etree.ElementTree as et 

xmlin = '''<Store> 
<foo> 
<book> 
<isbn>123456</isbn> 
</book> 
<title>XYZ</title> 
<checkout>no</checkout> 
</foo> 
<bar> 
<book> 
<isbn>7890</isbn> 
</book> 
<title>XYZ2</title> 
<checkout>yes</checkout> 
</bar> 
</Store>''' 

root = et.fromstring(xmlin) 

for child in root.getchildren(): 
    print et.tostring(child) 
0

xmldoc est un objet XML analysé. toxml() lui demande de se reconvertir en une chaîne de texte XML à nouveau. Explorez un peu plus loin:

>>> xmldoc.childNodes 
[<DOM Element: Store at 0x212b788>] 
>>> xmldoc.childNodes[0].childNodes 
[<DOM Text node "u'\n'">, <DOM Element: foo at 0x212bcd8>, <DOM Text node "u'\n'">, <DOM Element: bar at 0x212b2d8>, <DOM Text node "u'\n'">] 

Ensuite, se rendre compte que DOM est difficile de travailler avec et lire ElementTree.

Questions connexes