加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 对ElementTree解析器进行子类化以保留注释

发布时间:2020-12-20 13:38:54 所属栏目:Python 来源:网络整理
导读:尝试使用ElementTree来解析xml文件;因为默认情况下解析器不保留注释,所以使用了 http://bugs.python.org/issue8277中的以下代码: import xml.etree.ElementTree as etreeclass CommentedTreeBuilder(etree.TreeBuilder): """A TreeBuilder subclass that re
尝试使用ElementTree来解析xml文件;因为默认情况下解析器不保留注释,所以使用了 http://bugs.python.org/issue8277中的以下代码:

import xml.etree.ElementTree as etree

class CommentedTreeBuilder(etree.TreeBuilder):
    """A TreeBuilder subclass that retains comments."""

    def comment(self,data):
        self.start(etree.Comment,{})
        self.data(data)
        self.end(etree.Comment)

parser = etree.XMLParser(target = CommentedTreeBuilder())

以上是在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()

这个barfs:

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编码.

笔记):

>使用Python 3.3.在Kubuntu 13.04中,以防它是相关的.我确保使用“python3”(而不仅仅是“python”)来运行测试脚本.

编辑:这是使用的示例xml文件;它非常小(让我们看看我是否可以正确格式化):

<?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>

解决方法

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

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

请参阅Python issue #17901:在Python 3.4中,其中包含上述修复,不会发生从空堆栈弹出,但ParseError:顶层的多个元素被引发.

这是有道理的:如果要保留树中的注释,则需要将它们作为节点进行处理.并且XML只允许文档顶层的一个节点,因此您不能在第一个“真实”元素之前进行注释(如果强制解析器保留通知).

所以不幸的是,我认为这是你唯一的选择:从XML文件中删除根文档节点之外的那些注释 – 无论是在原始文件中,还是在解析之前剥离它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读