在Python3中解析特定的xml注释

时间:2016-08-03 16:33:04

标签: xml python-3.x

我有一个包含一个有趣评论的xml文件,我想解析它。

Here我发现了如何处理评论,但我不知道如何在我的主应用中使用它们。

#!/usr/bin/python3

import xml.etree.ElementTree as ET

with open('xml_with_comments.xml', 'w') as f:
    f.write('''<?xml version="1.0" encoding="UTF-8"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <blah>node 1</blah>
        <!-- secret_content: Hello! -->
        <blah>node 2</blah>
        <!-- A standard comment -->
        <blah>node 3</blah>
    </root>
    ''')

class TreeBuilderWithComments(ET.TreeBuilder):
    def comment(self, data):
        if data.startswith(' secret_content: '):
            self.start(ET.Comment, {})
            self.data(data)
            self.end(ET.Comment)
            print('Secret content from TreeBuilderWithComments: ' + data[17:-1])

root = ET.parse('xml_with_comments.xml', parser=ET.XMLParser(target=TreeBuilderWithComments())).getroot()
for blah in root.findall('blah'):
    print(blah.text)

输出:

Secret content from TreeBuilderWithComments: Hello!
node 1
node 2
node 3

现在我想做一些像print(root.get_secret_content())这样的事情,它应该打印文件的第一个评论,开始于&#39; secret_content:&#39;。

1 个答案:

答案 0 :(得分:1)

您在TreeBuilderWithComments()的调用中创建ET.parse的实例,如果您保留对它的引用,则可以使用该实例获取秘密内容:

 # do this first.
comment_handler = TreeBuilderWithComments()

root = ET.parse('xml_with_comments.xml',
                parser=ET.XMLParser(target=comment_handler)
               ).getroot()                # ^^ used here!

for blah in root.findall('blah'):
    print(blah.text)

然后,您可以对.get_secret_content类实施TreeBuilderWithComments并在comment_handler实例上使用它。