/ / In Python ElementTree, come faccio a sapere se un elemento è un commento? - pitone, albero degli elementi

In Python ElementTree, come faccio a sapere se un elemento è un commento? - python, elementtree

Ho un documento XML che assomiglia a qualcosa del genere:

<!-- 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>

Per renderlo più leggibile dall'uomo, ho trovato la funzione indent() http://effbot.org/zone/element-lib.htm#prettyprint il che rende l'output molto più gradevole.

Tuttavia, voglio formattare ulteriormente solo il fileCommenta gli elementi per renderli più facili da vedere. Ad esempio, semplicemente inserendo una riga vuota in più prima e dopo ogni commento, i blocchi saranno più facili da vedere per un essere umano:

<!-- 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>

Come posso rilevare gli elementi Comment nella mia funzione indent()?

risposte:

0 per risposta № 1

Dopo aver cercato inutilmente sul Web qualcun altro con lo stesso problema, mi sono rivolto al codice sorgente (https://svn.python.org/projects/python/trunk/Lib/xml/etree/ElementTree.py). La risposta è abbastanza semplice:

import ElementTree as ET

...

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

La chiave è stata rendersi conto che mentre il "tag"L'attributo su un elemento XML regolare porta il nome del tag XML (ad esempio, "listener" o "servlet"), per un elemento che rappresenta un commento XML è la funzione Comment() stessa.

Ecco la funzione indent() completamente aggiornata per eseguire la formattazione dei commenti come mostrato sopra:

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