2010-09-02 14 views
0

Je le document XML suivant que je dois analyser à l'aide de minidom python:Parsing document python minidom

<?xml version="1.0" encoding="UTF-8"?> 

<root> 
    <bash-function activated="True"> 
     <name>lsal</name> 
     <description>List directory content (-al)</description> 
     <code>ls -al</code> 
    </bash-function> 

    <bash-function activated="True"> 
     <name>lsl</name> 
     <description>List directory content (-l)</description> 
     <code>ls -l</code> 
    </bash-function> 
</root> 

Voici le code (la partie essentielle) où je suis en train d'analyser:

from modules import BashFunction 
from xml.dom.minidom import parse 

class FuncDoc(object): 
    def __init__(self, xml_file): 
     self.active_func = [] 
     self.inactive_func = [] 
     try: 
      self.dom = parse(xml_file) 
     except Exception as inst: 
      print type(inst) 
      print inst.args 
      print inst 

Malheureusement, je rencontre quelques erreurs. Voici le stacktrace:

<class 'xml.parsers.expat.ExpatError'> 
('no element found: line 1, column 0',) 
no element found: line 1, column 0 

En tant que débutant python, pouvez-vous s'il vous plaît me pointer vers la racine du problème.

+0

Comment appelez-vous FuncDoc? L'exemple fonctionne vraiment bien pour moi (au moins pas d'exceptions) –

+0

-1 pour ne pas fournir d'informations –

+0

@Ivo van der Wijk, probablement parce que je suis 24/24 devant l'ordinateur. Aussi je n'ai pas considéré cet aspect important. Je suppose que c'est assez logique que j'appelle le constructeur de FuncDom. –

Répondre

6

J'imagine que vous passez dans un descripteur de fichier, de la manière suivante:

>>> from xml.dom.minidom import parse 
>>> xmldoc = open("xmltestfile.xml", "rU") 
>>> x = FuncDoc(xmldoc) 

Je reçois la même erreur que vous faites si je tente d'analyser le même document deux fois sans fermer in- entre. Essayez ceci - l'erreur apparaît après la secondes Parse tentative:

>>> xmldoc.close() 
>>> xmldoc = open("xmltestfile.xml", "rU") 
>>> xml1 = parse(xmldoc) 
>>> xml2 = parse(xmldoc) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py", line 1918, in parse 
    return expatbuilder.parse(file) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 928, in parse 
    result = builder.parseFile(file) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 211, in parseFile 
    parser.Parse("", True) 
xml.parsers.expat.ExpatError: no element found: line 1, column 0 

Après l'analyse syntaxique pour la première fois, a été lu le fichier entier. La nouvelle tentative d'analyse reçoit alors 0 données. Je suppose que le fait que le document est analysé deux fois est un bug dans votre code. Si, cependant, c'est ce que vous voulez faire, vous pouvez le réinitialiser avec xmldoc.seek(0).

+0

Pour remettre le curseur au début, utilisez 'xmldoc.seek (0)'. – katrielalex

+0

Merci, bonne idée d'ajouter ceci, ce que j'ai fait. – chryss

+0

Merci pour votre réponse. Le problème est que je ne ferme pas() l'objet fichier quand je devrais l'avoir. –