Commenting and uncommenting XML via Python

末鹿安然 提交于 2019-12-22 11:10:08

问题


I would like to know of a way to comment and uncomment an element in XML using Python.

<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
   <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>
</target>

How can I get it to look like this:

<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="deploy"/>
   <!-- <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="deploy"/> -->
</target>

and then remove the comments again as needed... or

I am using minidom from xml.dom. Do I need to use a different XML parser? Would prefer to avoid using regex... that would be a nightmare.


回答1:


The script below uses xml.dom.minidom and includes functions for both commenting and uncommenting nodes:

from xml.dom import minidom

xml = """\
<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
   <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>
</target>
"""

def comment_node(node):
    comment = node.ownerDocument.createComment(node.toxml())
    node.parentNode.replaceChild(comment, node)
    return comment

def uncomment_node(comment):
    node = minidom.parseString(comment.data).firstChild
    comment.parentNode.replaceChild(node, comment)
    return node

doc = minidom.parseString(xml).documentElement

comment_node(doc.getElementsByTagName('ant')[-1])

xml = doc.toxml()

print 'comment_node():\n'
print xml
print

doc = minidom.parseString(xml).documentElement

comment = doc.lastChild.previousSibling

print 're-parsed comment:\n'
print comment.toxml()
print

uncomment_node(comment)

print 'uncomment_node():\n'
print doc.toxml()
print

Output:

comment_node():

<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
   <!--<ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>-->
</target>

re-parsed comment:

<!--<ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>-->

uncomment_node():

<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
   <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>
</target>



回答2:


a='''<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
      <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
         <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>
         </target>
         '''
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Comment, tostring

root = ET.fromstring(a)
element = root.getchildren()[2]
comment_element = Comment(tostring(element))
root.insert(2, comment_element)
root.remove(element)
print tostring(root)



回答3:


With ElementTree:

from xml.etree import ElementTree as etree

import sys

xml = """
<target depends="create-build-dir" name="build-Folio">
   <property name="project.name" value="Folio"/>
   <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package"/>
   <ant antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package"/>
</target>
"""

doc = etree.fromstring(xml)

antfiles = doc.getiterator("ant")
antfiles[1].tag = "!--"          # Comment the second antfile

print etree.tostring(doc)

# >>>
# <target depends="create-build-dir" name="build-Folio">
#    <property name="project.name" value="Folio" />
#    <ant antfile="build.xml" dir="Folio/FolioUI" inheritall="false" target="package" />
#    <!-- antfile="build.xml" dir="Folio/Folio" inheritall="false" target="package" />
# </target>

###


来源:https://stackoverflow.com/questions/8764017/commenting-and-uncommenting-xml-via-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!