【问题标题】:Using Python to comment out XML使用 Python 注释掉 XML
【发布时间】:2014-01-08 14:44:37
【问题描述】:

我正在尝试(但失败)从 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>

谢谢!

【问题讨论】:

  • 请说清楚什么是原始文件,你希望输出什么?
  • domain.xml 文件的大小 >30K,因此发布整个内容并没有多大意义,但是我试图做的是找到包含 urn:jboss:domain:messaging 的 XML 节: 1.4 然后在整个事情周围插入注释,所以

标签: python xml jboss minidom


【解决方案1】:

您遇到的问题是您尝试注释掉的部分已经包含 XML cmets。 XML 中不允许嵌套 cmets。 (有关更多信息,请参阅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 cmets,因此它们不再是 cmets,方法是将“--”替换为“--”。 (请注意,如果取消注释该部分,这可能会破坏 XML 文件结构。如果要再次解析,则必须反转该过程。)插入后,脚本会删除原始节点。然后它将所有内容写入一个临时文件,并使用 shutil 将其复制回原始文件。

我使用您在下面的评论中发布到 pastebin 的文件在我的系统上对此进行了测试,它可以正常工作。

请注意,这是一种快速而肮脏的 hack - 因为脚本还会将该部分中的任何地方的“--”替换为“--”,并且如果作为 XML 节点的一部分的其他文本具有“-” -' 在里面,它也将被替换......

这样做的正确方法可能是使用lxml 的elementtree 实现,使用lxml's XSL 到select only comments within the section,然后适当地删除或转换它们——这样你就不会搞砸非评论文本。但这可能超出了您所要求的范围。 (Python内置的elementtree没有完整的XSL实现,可能不能用来选择cmets。)

【讨论】:

  • 谢谢,但它在配置文件上不起作用并删除了文件的其余部分,尽管通过一些调试运行它确实会产生这个错误 - xmldoc.writexml(file) File "/usr/lib/python2 .7/xml/dom/minidom.py”,第 1752 行,在 writexml 文件中“/usr/lib/python2.7/xml/dom/minidom.py”,第 1138 行,在 writexml [...] "'--' is not allowed in a comment node") ValueError: '--' is not allowed in a comment node 这表明它写出文档失败是实际问题!
  • 如果你把实际的配置文件放在一个 pastebin (pastebin.com) 并在这里发布一个链接,我会看看。
  • 问题是您要注释掉的两个部分中的每一部分都有一个 XML 注释。您不能下一个 XML cmets,有关更多信息,请参阅此答案以获取更多信息:stackoverflow.com/questions/1324821/nested-comments-in-xml 不过,有一种方法可以通过更改内部 cmets 来使其正常工作 - 我会用它来更新我的答案。跨度>
  • 这个我不知道!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多