python – 对ElementTree解析器进行子类化以保留注释
尝试使用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文件中删除根文档节点之外的那些注释 – 无论是在原始文件中,还是在解析之前剥离它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |