Python 子类化ElementTree解析器以保留注释

Python 子类化ElementTree解析器以保留注释,python,xml,Python,Xml,尝试使用ElementTree解析xml文件;由于默认情况下解析器不保留注释,因此使用以下代码: 以上内容在documents.py中。通过以下方式进行测试: class TestDocument(unittest.TestCase): def setUp(self): filename = os.path.join(sys.path[0], "data", "facilities.xml") self.doc = etree.parse(filenam

尝试使用ElementTree解析xml文件;由于默认情况下解析器不保留注释,因此使用以下代码:

以上内容在documents.py中。通过以下方式进行测试:

class TestDocument(unittest.TestCase):

    def setUp(self):
        filename = os.path.join(sys.path[0], "data", "facilities.xml")
        self.doc = etree.parse(filename, parser = documents.parser)

    def testClass(self):
        print("Class is {0}.".format(self.doc.__class__.__name__))
        #commented out tests.

if __name__ == '__main__':
    unittest.main()
这是因为:

Traceback (most recent call last):
File "/home/goncalo/documents/games/ja2/modding/mods/xml-overhaul/src/scripts/../tests/test_documents.py", line 24, in setUp
    self.doc = etree.parse(filename, parser = documents.parser)
File "/usr/lib/python3.3/xml/etree/ElementTree.py", line 1242, in parse
    tree.parse(source, parser)
File "/usr/lib/python3.3/xml/etree/ElementTree.py", line 1726, in parse
    parser.feed(data)
IndexError: pop from empty stack
我做错了什么?顺便说一下,文件中的xml是有效的(由独立程序检查),并且采用utf-8编码

注:

  • 使用Python3.3。在Kubuntu 13.04中,以防相关。我确保使用“python3”(而不仅仅是“python”)来运行测试脚本
编辑:这里是使用的示例xml文件;它非常小(让我们看看是否可以正确设置格式):


B13
4.
0

您添加的示例XML在2.7中适用于我,但在3.3中与您描述的堆栈跟踪中断

问题似乎是第一条注释——在XML声明之后,在第一个元素之前。它不是2.7中树的一部分(不过不会引发异常),并导致3.3中的异常

请参阅:在包含上述修复的Python3.4中,
pop from empty stack
不会出现,但会引发
ParseError:top level上的多个元素

这是有意义的:如果您想在树中保留注释,它们需要被视为节点。XML只允许文档顶层有一个节点,因此在第一个“real”元素之前不能有注释(如果强制解析器保留逗号)


因此,不幸的是,我认为这是您唯一的选择:从XML文件中删除根文档节点之外的注释-要么在原始文件中,要么在解析之前剥离它们。

我认为这是一个非常好的问题。这是一个很好的问题,如果您能提供一个非常简短的xml示例,它会导致失败。您是否尝试过使用罚单中的Amaury代码?他使用了2.7/3.x中较新的元素树,而不是您尝试的元素树。@LukasGraf--OP使用的是python3.3。你能解释一下2.7/3.x中的ElementTree是如何更新的吗?我不确定我是否遵循:)比Patrick Westerhoff显然使用的版本更新,请参见他链接的罚单。阿莫里为新的ET提供了一些代码,但没有为帕特里克工作,因为我认为他使用的是旧版本。OP尝试了Patrick的代码,尽管他在3.3上,而Amaury的代码在2.7 BTW上对我来说很好。
Traceback (most recent call last):
File "/home/goncalo/documents/games/ja2/modding/mods/xml-overhaul/src/scripts/../tests/test_documents.py", line 24, in setUp
    self.doc = etree.parse(filename, parser = documents.parser)
File "/usr/lib/python3.3/xml/etree/ElementTree.py", line 1242, in parse
    tree.parse(source, parser)
File "/usr/lib/python3.3/xml/etree/ElementTree.py", line 1726, in parse
    parser.feed(data)
IndexError: pop from empty stack
<?xml version="1.0" encoding="utf-8"?>
<!-- changes to facilities.xml by G. Rodrigues: ar overhaul.-->
<SECTORFACILITIES>
    <!-- Drassen -->
    <!-- Small airport -->
    <FACILITY>
        <SectorGrid>B13</SectorGrid>
        <FacilityType>4</FacilityType>
        <ubHidden>0</ubHidden>
    </FACILITY>
</SECTORFACILITIES>