在PythonElementTree中,如何判断元素是否是注释?
我有一个XML文档,看起来像:在PythonElementTree中,如何判断元素是否是注释?,python,elementtree,Python,Elementtree,我有一个XML文档,看起来像: <!-- Servlet Context Listener --> <listener> <listener-class> com.company.servlet.StartupShutdownListener </listener-class> </listener> <!-- Servlet Class Definitions --> <servlet> <servlet
<!-- 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>
com.company.servlet.StartupShutdownListener
AdminServlet
AdminServlet
1.
为了让它更具可读性,我找到了indent()函数,该函数使输出更加友好
但是,我只想进一步格式化注释元素,使它们更易于查看。例如,只需在每个注释之前和之后添加一个额外的空行,就可以让人更容易看到这些块:
<!-- 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>
com.company.servlet.StartupShutdownListener
AdminServlet
AdminServlet
1.
如何在indent()函数中检测注释元素?在web上搜索其他任何有相同问题的人都没有结果后,我转向了源代码()。答案相当简单:
import ElementTree as ET
...
def indent(elem, level=0): # where elem is of type ET.Element
....
if elem.tag is ET.Comment:
...
关键是要认识到,虽然常规XML元素上的“tag”属性带有XML标记名(例如,“listener”或“servlet”),但对于表示XML注释的元素,它本身就是comment()函数
下面是完整更新的indent()函数,用于执行注释格式设置,如上所示:
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
def缩进(元素,级别=0,上一个元素=None,上一个级别=0):
i=“\n”+级别*”
如果len(elem):
如果不是elem.text或不是elem.text.strip():
elem.text=i+“”
如果不是elem.tail或不是elem.tail.strip():
elem.tail=i
prev_elem_local=elem
上一级本地=上一级
对于elem中的elem:
缩进(元素,级别+1,上一个元素本地,上一个级别本地)
prev_elem_local=elem
上一级本地=级别+1
如果不是elem.tail或不是elem.tail.strip():
elem.tail=i
其他:
如果水平和(不是elem.tail或不是elem.tail.strip()):
elem.tail=i
如果元素标签为等注释:
如果上一级=下一级:
prev_elem.tail=“\n”+prev_elem.tail
elif上一级<下一级:
prev_elem.text=“\n”+prev_elem.text
elem.tail=“\n”+elem.tail