2017-11-11 136 views
0

我有一个看起来像一个XML文档:在Python ElementTree中,如何判断元素是否为注释?

<!-- Servlet Context Listener --> 
<listener> 
<listener-class> 
com.company.servlet.StartupShutdownListener 
</listener-class> 
</listener> 
<!-- Servlet Class Definitions --> 
<servlet> 
<servlet-name> 
AdminServlet 
</servlet-name> 
<servlet-class> 
AdminServlet 
</servlet-class> 
<load-on-startup> 
1 
</load-on-startup> 
</servlet> 

为了使它更可读,我发现缩进()函数http://effbot.org/zone/element-lib.htm#prettyprint这使得输出更漂亮。

但是,我想进一步格式化评论元素,以便更容易看到。例如,简单地将一个额外的空白行前后各有意见,使块更容易看到一个人:

<!-- Servlet Context Listener --> 

<listener> 
    <listener-class> 
    com.company.servlet.StartupShutdownListener 
    </listener-class> 
</listener> 

<!-- Servlet Class Definitions --> 

<servlet> 
    <servlet-name>AdminServlet</servlet-name> 
    <servlet-class>AdminServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

我如何检测我的缩进()函数的评价要素是什么?

回答

0

经过在网络上搜索没有任何人遇到同样的问题后,我转向源代码(https://svn.python.org/projects/python/trunk/Lib/xml/etree/ElementTree.py)。答案很简单:

import ElementTree as ET 

... 

def indent(elem, level=0): # where elem is of type ET.Element 
    .... 
    if elem.tag is ET.Comment: 
     ... 

的关键是认识到同时定期XML元素的“标签”属性带有XML标记的名称(例如,“监听器”或“小服务程序”),对于一个元素代表一个XML注释,它是Comment()函数本身。

以下是完整的更新缩进()函数来完成的注释格式化如上图所示:

def indent(elem, level=0, prev_elem=None, prev_level=0):   
    i = "\n" + level*" "   
    if len(elem):   
     if not elem.text or not elem.text.strip():   
      elem.text = i + " "   
     if not elem.tail or not elem.tail.strip():   
      elem.tail = i   
     prev_elem_local = elem   
     prev_level_local = level   
     for elem in elem:   
      indent(elem, level+1, prev_elem_local, prev_level_local)   
      prev_elem_local = elem   
      prev_level_local = level + 1   
     if not elem.tail or not elem.tail.strip():   
      elem.tail = i   
    else:   
     if level and (not elem.tail or not elem.tail.strip()):   
      elem.tail = i   
     if elem.tag is ET.Comment:   
      if prev_level == level:   
       prev_elem.tail = "\n" + prev_elem.tail   
      elif prev_level < level:   
       prev_elem.text = "\n" + prev_elem.text   
      elem.tail = "\n" + elem.tail   
相关问题