2016-08-03 34 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