【问题标题】:Parsing document with python minidom使用 python minidom 解析文档
【发布时间】:2011-04-07 06:08:03
【问题描述】:

我必须使用 python 的 minidom 解析以下 XML 文档:

<?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初学者,能否请您指出问题的根源。

【问题讨论】:

  • 如何调用 FuncDoc?该示例实际上对我来说很好(至少没有例外)
  • -1 不提供信息
  • @Ivo van der Wijk,可能是因为我 24/24 在电脑前。我也不认为这方面很重要。我想我调用 FuncDom 的构造函数是很合乎逻辑的。
  • 如果我理解正确的话,当您再次创建一个具有相同文件对象的新实例时会出现问题,而不是第一次。非常相关。

标签: python parsing dom minidom


【解决方案1】:

我想你正在通过以下方式传递一个文件句柄:

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

如果我尝试解析同一个文档两次而不在中间关闭它,我会遇到与您相同的错误。试试这个——错误出现在 second 解析尝试之后:

>>> 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) 重置它。

【讨论】:

  • 要将文件光标设置回开头,请使用xmldoc.seek( 0 )
  • 感谢您的回答。问题是我不应该关闭()文件对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2020-08-28
  • 2017-09-22
  • 2018-10-23
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多