2016-08-03 63 views
0

我有一个xml文件,包含一个有趣的评论,我想解析它。在Python3中解析特定的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()),应由打印文件begining的第一个注释 'secret_content:'。

回答

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_contentTreeBuilderWithComments类并在comment_handler实例上使用它。

+0

谢谢!我还修改了TreeBuilderWithComments.comment():'def comment(self,data):[\ n] SECRET_CONTENT_KEY ='secret_content:'[\ n] data = data.strip()[\ n]如果data.startswith(SECRET_CONTENT_KEY) :[\ n] self.secret_content = data [len(SECRET_CONTENT_KEY):]'。所以_get_secret_content()_是一个简单的getter。 – roipoussiere