Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python注释XML_Python_Xml_Jboss_Minidom - Fatal编程技术网

使用Python注释XML

使用Python注释XML,python,xml,jboss,minidom,Python,Xml,Jboss,Minidom,我正在尝试(但失败)从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:domai

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

真的
尼奥
2.
[....]

谢谢

您遇到的问题是,您试图注释掉的部分已经包含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将其复制回原始文件

我在我的系统上测试了这一点,使用了您在下面的评论中发布到粘贴箱的文件,它可以正常工作

请注意,这是一种快速而肮脏的攻击-因为脚本还将在该部分的任何地方用“--”替换“--”,如果XML节点中有其他文本包含“--”,它也将被替换


这样做的正确方法可能是使用的实现,使用to,并适当地删除或转换它们——这样您就不会弄乱未注释的文本。但这可能超出了你要求的范围。(Python的内置没有完整的XSL实现,可能无法用于选择注释。)

请明确原始文件是什么,您希望输出什么?domain.xml文件的大小>30K,因此发布整个内容没有多大意义,然而,我试图做的是找到包含urn:jboss:domain:messaging:1.4的XML节,然后围绕整个内容插入一条注释,谢谢,但它对配置文件不起作用,并删除了文件的其余部分,尽管通过一些调试运行它确实会产生这个错误-xmldoc.writexml(file)文件“/usr/lib/python2.7/xml/dom/minidom.py”,第1752行,在writexml文件中“/usr/lib/python2.7/xml/dom/minidom.py”,第1138行,在writexml[…]中,引发ValueError(“注释节点中不允许使用“---”)ValueError:“--”不允许出现在注释节点中,这表明文档写入失败,这才是真正的问题!如果将实际配置文件放入pastebin()然后在这里发布一个链接,我来看看。问题是,在您要注释的两个部分中的每一部分都有一个XML注释。您不能下一个XML注释,有关更多信息,请参阅此答案以获取更多信息:有一种方法可以让它工作,不过,通过更改内部注释-我将用它更新我的答案。这我不知道!非常感谢。