Python 子类化ElementTree解析器以保留注释
尝试使用ElementTree解析xml文件;由于默认情况下解析器不保留注释,因此使用以下代码: 以上内容在documents.py中。通过以下方式进行测试: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
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”)来运行测试脚本
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>