2013-12-19 145 views
0

我試圖(和失敗)從一個JBoss 6.2 domain.xml文件中註釋掉HornetQ的配置,而不是圍繞插入我想刪除節評論,我要管理刪除文件中的所有內容。使用Python註釋掉XML

我到目前爲止的代碼是

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

請說清楚,什麼是原始文件,你能指望什麼輸出? – Skyler

+0

domain.xml文件的大小大於30K,因此發佈整個內容並沒有多大意義,但是我試圖做的是找到包含urn的jboss:domain:messaging:1.4的XML節,然後插入註釋整個事情,所以< - <子系統的xmlns =! 「甕:JBoss的:域:短信:1.4」> <啓用持久性>真正 [.... ] - > – BenH

回答

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將其複製回原始文件。

我測試了我的系統上,使用您張貼在下面的評論中引擎收錄的文件,它的工作原理。

請注意,這是一種快速而骯髒的黑客攻擊 - 因爲該腳本還將在該節的任何地方用' - '替換' - ',並且如果有其他文本作爲XML節點的一部分, - 「它,它也將被替換...

這樣做的正確的方式很可能是使用lxmlelementtree實現,使用lxml's XSLselect only comments within the section,並刪除或適當地改造他們 - 讓你不要搞亂沒有評論的文字。但這可能超出了你所問的範圍。 (Python的內置elementtree沒有一個完整的XSL實現,可能不能用來選擇註釋。)

+0

謝謝,但它沒有在配置文件中的工作和刪除的文件的剩餘部分,儘管運行它與一些調試確實產生這個錯誤 - xmldoc.writexml(文件) 文件「/ usr/lib/pytho n2.7/XML/DOM/minidom.py」,行1752年中WriteXML 文件 「/usr/lib/python2.7/xml/dom/minidom.py」,線1138,在中WriteXML [...] 提高ValueError(「 - 」在註釋節點中不允許) ValueError:' - '不允許在評論節點中 這表明它寫出文檔失敗是實際問題! – BenH

+0

如果您將實際的配置文件放入pastebin(http://pastebin.com/)並在此處發佈鏈接,我會看一看。 –

+0

好主意 - http://pastebin.com/YTPx0tK3 - 謝謝! – BenH