我试图(但失败了)从JBoss 6.2 domain.xml文件中注释掉HornetQ配置,而不是在我想要删除的节周围插入注释,而是设法删除文件中剩余的所有内容。
到目前为止,我的代码是
from xml.dom import minidom
import os, time, shutil
domConf=('/home/test/JBoss/jboss-eap-6.2/domain/configuration/domain.xml')
commentSub=('urn:jboss:domain:messaging:1.4')
now=str(int(time.time()))
bkup=(domConf+now)
shutil.copy2(domConf, bkup)
xmldoc = minidom.parse(domConf)
itemlist = xmldoc.getElementsByTagName('subsystem')
for s in itemlist:
if commentSub in s.attributes['xmlns'].value:
s.parentNode.insertBefore(xmldoc.createComment(s.toxml()), s)
file = open(domConf, "wb")
xmldoc.writexml(file)
file.write('n')
file.close()
我想评论的配置是-
<subsystem xmlns="urn:jboss:domain:messaging:1.4">
<hornetq-server>
<persistence-enabled>true</persistence-enabled>
<journal-type>NIO</journal-type>
<journal-min-files>2</journal-min-files>
<connectors>
[....]
</pooled-connection-factory>
</jms-connection-factories>
</hornetq-server>
</subsystem>
谢谢!
您遇到的问题是,您试图注释掉的部分已经包含XML注释。XML中不允许使用嵌套注释。(有关更多信息,请参阅XML中的嵌套注释?。)
我认为你需要做的是:
from xml.dom import minidom
import os, time, shutil
domConf=('/home/test/JBoss/jboss-eap-6.2/domain/configuration/domain.xml')
resultFile='result.xml'
commentSub=('urn:jboss:domain:messaging:1.4')
now=str(int(time.time()))
bkup=(domConf+now)
shutil.copy2(domConf, bkup)
xmldoc = minidom.parse(domConf)
itemlist = xmldoc.getElementsByTagName('subsystem')
for s in itemlist:
if commentSub in s.attributes['xmlns'].value:
commentText = s.toxml()
commentText = commentText.replace('--', '- -')
s.parentNode.insertBefore(xmldoc.createComment(commentText), s)
s.parentNode.removeChild(s)
file = open("result.xml", "wb")
xmldoc.writexml(file)
file.write('n')
file.close()
shutil.copy2(resultFile, domConf)
这会像您所做的那样查找注释,但在插入注释之前,会通过将"--"替换为"--"来更改任何嵌套的XML注释,使其不再是注释。(请注意,如果取消对该节的注释,这可能会破坏XML文件结构。如果希望它再次解析,则必须反转过程。)插入后,脚本将删除原始节点。然后,它将所有内容写入一个临时文件,并使用shutil将其复制回原始文件。
我在我的系统上测试了这一点,使用了你在下面评论中发布到pastebin的文件,它很有效。
请注意,这是一种快速而肮脏的破解方法,因为脚本还会在该部分的任何地方用"--"替换"--",如果XML节点中有其他文本包含"--"时,它也会被替换。。。
正确的方法可能是使用lxml的elementtree实现,使用lxml的XSL只选择部分中的注释,然后适当地删除或转换它们,这样就不会弄乱未注释的文本。但这可能超出了你所要求的范围。(Python的内置elementtree没有完整的XSL实现,可能无法用于选择注释。)