【发布时间】: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 文件损坏的案例。
【问题讨论】:
标签: python xml parsing minidom