Разбор документа с помощью python minidom

У меня есть следующий XML-документ, который мне нужно проанализировать с помощью минидома Python:

<?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>

Вот код (основная часть), где я пытаюсь разобрать:

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

К сожалению, я сталкиваюсь с некоторыми ошибками. Вот трассировка стека:

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

Как новичок в Python, не могли бы вы указать мне на корень проблемы.


person Andrei Ciobanu    schedule 02.09.2010    source источник
comment
Как вы называете FuncDoc? Пример на самом деле отлично работает для меня (по крайней мере, без исключений)   -  person Ivo van der Wijk    schedule 02.09.2010
comment
-1 за непредоставление информации   -  person Ivo van der Wijk    schedule 02.09.2010
comment
@Иво ван дер Вейк, наверное, потому что я 24/24 перед компьютером. Также я не считал этот аспект важным. Думаю, вполне логично, что я вызываю конструктор FuncDom.   -  person Andrei Ciobanu    schedule 02.09.2010
comment
Если я правильно понимаю, проблема возникает при создании нового экземпляра с тем же файловым объектом снова, а не в первый раз. Довольно актуально.   -  person Ivo van der Wijk    schedule 02.09.2010


Ответы (1)


Я предполагаю, что вы передаете дескриптор файла следующим образом:

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

Я получаю ту же ошибку, что и вы, если я пытаюсь дважды проанализировать один и тот же документ, не закрывая его между ними. Попробуйте следующее: ошибка появляется после второй попытки синтаксического анализа:

>>> 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

После первого синтаксического анализа был прочитан весь файл. Затем новая попытка синтаксического анализа получает 0 данных. Я предполагаю, что тот факт, что документ анализируется дважды, является ошибкой в ​​​​вашем коде. Однако, если это то, что вы хотите сделать, вы можете сбросить его с помощью xmldoc.seek(0).

person chryss    schedule 02.09.2010
comment
Чтобы вернуть файловый курсор в начало, используйте xmldoc.seek( 0 ). - person Katriel; 02.09.2010
comment
Спасибо за Ваш ответ. Проблема в том, что я не закрыл () файловый объект, когда должен был. - person Andrei Ciobanu; 02.09.2010