2010-10-23 6 views
3

J'ai besoin d'analyser le document XML, puis d'écrire chaque nœud dans des fichiers séparés en respectant l'ordre exact des attributs. Donc, si j'ai fichier d'entrée comme:Analyseur syntaxique XML qui conserve l'ordre des attributs

<item a="a" b="b" c="c"/> 
<item a="a1" b="b2" c="c3"/> 

sortie devrait être de 2 fichiers avec chaque élément. Maintenant, si xml.dom.minidom est utilisé - pour l'attribut est changé en sortie (je peux obtenir - <item b="b" c="c" **a="a"**/>).

J'ai trouvé pxdom lib, il maintient l'ordre, mais très très lent (analyse syntaxique minidom prend 0,08 sec, pxdom l'analyse prend 2,5 sec.)

Existe-t-il d'autres bibliothèques python pouvant conserver des attributs? UPD: libarry devrait également conserver les majuscules et les minuscules. Donc, "Item" ne correspond pas à "item"

+0

Le consensus général est que l'ordre des attributs n'a pas d'importance. Pourquoi avez-vous besoin de les garder commandés? – delnan

+0

Ce n'est pas mon souhait) Malheureusement GDS (système de distribution globale) avec lequel je travaille exige une correspondance exacte de l'ordre des attributs. – Andrew

Répondre

1

Vous trouverez peut-être utile this question. Synthèse: les outils xml standard et les bibliothèques ne seront probablement pas en mesure de le faire.

+0

merci, j'ai vu que Q, pxdom le fait mais très très lent. En général, le problème est de trouver une bibliothèque qui utilise list (au lieu de dict) comme stockage pour attr – Andrew

+0

Une bibliothèque qui le fait devrait stocker à la fois un dict et une liste, à la fois pour le mapping et l'ordre. Ou peut-être un OrderedDict. J'ai essayé ce scénario avec 'lxml' avant de poster cette réponse, et peu importe le nombre d'attributs ajoutés, les clés * étaient toujours dans l'ordre indiqué dans le fichier xml. Mais je n'ai aucune idée si cela est garanti. – snapshoe

0

Vous pouvez utiliser BeautifulSoup:

>>> from BeautifulSoup import BeautifulSoup as soup 

>>> html = '''<item a="a" b="b" c="c"/> 
<item a="a1" b="b2" c="c3"/>''' 
>>> s = soup(html) 
>>> s.findAll('item') 
[<item a="a" b="b" c="c"></item>, <item a="a1" b="b2" c="c3"></item>] 
+1

malheureusement BeautifulSoup change tous les nœuds en minuscules. et il semble que beatifulsoup ne peut pas être sensible à la casse – Andrew

+0

Ah vous avez raison! – rubik

+1

vous pouvez conserver la casse en sélectionnant l'option d'analyse XML: par exemple. s = soupe (html, "xml") – RaamEE