Python XML Parser:文档元素之后的垃圾

时间:2017-10-06 23:01:18

标签: python

我正在学习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> 

1 个答案:

答案 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()