2016-01-13 87 views
1

我使用minidom编写了一个代码,它使用xml脚本,将其作为文件对象打开,然后解析该文件对象。不仅如此,我还希望脚本打开全部包含在文件夹中的多个文件,并分别解析每个文件。Python Minidom解析文件对象

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]其中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文件的案例。

+0

您是否在每次迭代中检查了变量'f' /'f [m]'/'filename [m]'等的内容? – kazbeel

+0

嗨,我有“当我打印文件名(这将是变量f),他们是正确的。” (我也打印了文件名[m],他们是正确的)如果出现问题,我不认为open(f)会起作用。 –

+0

尝试使用标准的'os.path.join()'([doc](https://docs.python.org/2/library/os.path.html#os.path.join))加入indir并文件。 – kazbeel

回答

0

您确定所有XML文件中包含的XML数据都正确吗?也许一个人是空的,你必须处理这种例外。无论如何,我建议你使用xml.etreedoc