【问题标题】:Python Minidom Parsing File ObjectsPython Minidom 解析文件对象
【发布时间】:2016-04-18 08:13:54
【问题描述】:

我使用 minidom 编写了一个代码,该代码采用 xml 脚本,将其作为文件对象打开,然后解析该文件对象。不仅如此,我还希望脚本打开多个文件,这些文件都包含在一个文件夹中,并单独解析每个文件。

xml 脚本的一个示例是:

<?xml version="1.0"?>
<Data>
  <data1>1</data1>
  <data2>2</data2>
  <data3>3</data3>
  <Sub_data>
    <sub_data1>0.1111111111111</sub_data1>
    <sub_data2>0.2222222222222</sub_data2>
    ... and so on.

也就是说,它很标准。

现在,我的代码如下所示:

import os
import io
from xml.dom import minidom

#folder where xml files are located
indir = '/foo/bar/docs/'

    masterlist = []

    for root, dirs, filenames in os.walk(indir):
      for f in filenames:
        row = []
        fsock = io.open(indir + f, mode = 'rt', encoding = 'cp1252')
        xmldoc = minidom.parse(fsock)
        ...

我得到的错误是:

Traceback (most recent call last): File "kgp_2.py", line 34, in
<module> xmldoc = minidom.parse(fsock) File
"/usr/lib/python2.7/xml/dom/minidom.py", line 1918, in parse return
expatbuilder.parse(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 928, in parse
result = builder.parseFile(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 211, in parseFile
parser.Parse("", True) xml.parsers.expat.ExpatError: no element found:
line 203, column 1381

现在,当我做出改变时:

fsock = io.open(indir + filenames[0], mode = 'rt', encoding = 'cp1252')

这很好用,也就是说,它打开了文件夹中的第一个文件;但我想解析文件夹中的所有文件。当我执行如下循环时:

m = 0
... in loop:
fsock = io.open(indir + filenames[m], mode = 'rt', encoding = 'cp1252')
...
m = m+1

我得到了原来的错误。

我使用io库而不是通常的文件打开功能的原因是之前的堆栈溢出文章推荐了它。使用:

fsock = open(indir + filenames[0])

和以前一样,没有错误,但是:

fsock = open(indir + f)

#with a loop over m, like above
fsock = open(infir + filenames[m])

得到与上面相同的错误。

一个奇怪的问题。当我打印文件名时,它们是正确的。他们正在被打开,那里没有错误。只是解析器不会解析目标文件,即使filenames[m] where m = 0,这应该没问题吧?

编辑: Parsing document with python minidom

在这篇文章中他们遇到了类似的问题,解决方法是使用

    xmldoc.seek(0)

但是,对我来说,这会返回

Traceback (most recent call last):
File "kgp_2.py", line 45, in <module>
xmldoc.seek(0)
AttributeError: Document instance has no attribute 'seek'

编辑 2:已解决。这是一个输入 XML 文件损坏的案例。

【问题讨论】:

  • 你有没有在每次迭代中检查变量f/f[m]/filename[m]等的内容?
  • 嗨,我有“当我打印文件名(即变量 f)时,它们是正确的。” (我也打印了 filename[m] 并且它们是正确的)如果那里有问题,我认为 open(f) 不会起作用,它确实有效。
  • 尝试使用标准的os.path.join() (doc) 加入indir 和文件。
  • 我试了一下,我得到了同样的错误
  • 您确定 all XML 文件中包含的 XML 数据正确吗?也许一个是空的,你必须处理这样的异常。无论如何,我建议您使用xml.etree (doc)。

标签: python xml parsing minidom


【解决方案1】:

您确定所有 XML 文件中包含的 XML 数据都是正确的吗?也许一个是空的,你必须处理这样的异常。总之我推荐你使用xml.etreedoc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2017-09-22
    • 2018-10-23
    相关资源
    最近更新 更多