我正在尝试(并且失败)从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>
谢谢!
答案 0 :(得分:1)
您遇到的问题是您尝试注释的部分已包含XML注释。 XML中不允许嵌套注释。 (有关详细信息,请参阅Nested comments in 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's XSL到select only comments within the section,然后适当地删除或转换它们 - 所以你不要搞乱未评论的文字。但这可能超出了你所要求的范围。 (Python的内置elementtree没有完整的XSL实现,可能无法用于选择注释。)