我正在学习Python。我有一个大型XML文件,其数据类似于:
testData3.xml文件
<r><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c></c><c></c><c>something1</c><c>something1</c></r>
<r><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c></c><c></c><c>something2</c><c>something2</c></r>
我从我的一本Python书籍中复制了一个XML解析器,当数据文件只包含一行时,它可用于收集数据。只要我添加第二行数据,脚本就会在运行时失败。
我正在运行的Python脚本(xmlReader.py):
from xml.dom.minidom import parse, Node
xmltree = parse('testData3.xml')
for node1 in xmltree.getElementsByTagName('c'):
for node2 in node1.childNodes:
if node2.nodeType == Node.TEXT_NODE:
print(node2.data)
我正在寻找一些关于如何编写循环的帮助,以便我的xmlReader.py继续遍历整个文件,而不只是一行。运行此脚本时出现以下错误:
执行期间的错误:
xxxx@xxxx:~/xxxx/xxxx> python xmlReader.py
Traceback (most recent call last):
File "xmlReader.py", line 2, in <module>
xmltree = parse('testData3.xml')
File "/usr/lib64/python2.6/site-packages/_xmlplus/dom/minidom.py", line 1915, in parse
return expatbuilder.parse(file)
File "/usr/lib64/python2.6/site-packages/_xmlplus/dom/expatbuilder.py", line 926, in parse
result = builder.parseFile(fp)
File "/usr/lib64/python2.6/site-packages/_xmlplus/dom/expatbuilder.py", line 207, in parseFile
parser.Parse(buffer, 0)
xml.parsers.expat.ExpatError: junk after document element: line 2, column 0
xxxx@xxxx:~/xxxx/xxxx>
答案 0 :(得分:1)
问题是您的示例数据不是有效的XML。有效的XML文档应该有一个根元素;这对于文件的一行是正确的,其中<r>
是根元素,但是当您添加第二行时不是这样,因为每一行都包含在单独的<r>
元素中,但是文件中没有全局父元素。
构造有效的XML,例如:
<root>
<r><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c>something1</c><c></c><c></c><c>something1</c><c>something1</c></r>
<r><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c>something2</c><c></c><c></c><c>something2</c><c>something2</c></r>
</root>
或逐行解析文件:
from xml.dom.minidom import parseString
f = open('testData3.xml'):
for line in f:
xmltree = parseString(line)
...
f.close()