2010-01-07 18 views
6

我知道這是一個邊界情況,無論它確實屬於stackoverflow還是超級用戶,但是因爲似乎有很多「編輯代碼」問題在這裏,我將它張貼在SO上。如何獲得一個平坦的XML,以便將外部實體合併到頂層

我有一堆XML文件,有人以他們的無限智慧決定使用標籤將其分解爲多個文件,結果使得調試/編輯它們成爲一個巨大的P-i-t-A。因此,我正在尋找:

  1. VIM中的一種方法是在單個緩衝區中打開它們(最好是將更改保存在正確的外部實體文件中),或;
  2. 一種擴展VIM中的文件的方法,以便讀取外部實體並將其替換到緩衝區中,或者;命令行(或.vimrc裏)就這樣做的
  3. 一個簡單的bash/SED/Python的方式包括在頂層

的文件可能包括新的文件等等對誰知道有多少水平所以這就需要將遞歸...

這裏有什麼頂層文件看起來像一個樣機樣品:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foobar PUBLIC "foobar:dtd" "foobar.dtd" [ 

     <!ENTITY foo SYSTEM "foo.xml"> 

     <!ENTITY bar SYSTEM "bar.xml"> 
]> 
<foo> 
     <params> 
       &foo; 
     </params> 
     <bar> 
       &bar; 
     </bar> 
</foo> 

編輯: 列表是按優先順序 - 如果沒有1或2的解決方案是可用的,賞金無二的最佳#3 ...

編輯2: 看起來@Gaby的回答作品,但遺憾的是隻有部分,除非我做錯了什麼 - 我會用他的答案寫一些工具,並在這裏發佈以改進。當然,1號或2溶液,將不勝感激... :)

編輯3: 好,最好的非Emacs的-answer將獲得獎金;)

結論 : 感謝@hcayless我現在有一個工作的#2的解決方案,我說:

autocmd BufReadPost,FileReadPost *.xml silent %!xmllint --noent - 2> /dev/null 

.vimrc,一切都是虎背熊腰,腳蹬dory沒問題。

+0

這可以用xslt完成嗎? – michael 2010-01-08 06:57:13

+1

我以前沒有見過這個,但顯然這是對XML的善良部分。 http://www.xml.com/pub/a/98/08/xmlqna2.html是我找到的一個解釋。 – MikeSep 2010-01-08 22:50:25

+0

是的,這是有效的,因此兩次討厭:) – Kimvais 2010-01-09 07:39:59

回答

5

如果你安裝了libxml2,那麼xmllint可能會爲你做這件事。根據您的設置,可能需要更多的參數,可以但是對於你的榜樣,

xmllint --noent foobar.xml 

將打印文件以解決所有實體到標準輸出。應該很簡單,可以包裝一些bash腳本來執行你所需要的操作。

+0

完美的作品。謝謝! - 現在我只需要在打開.xml文件時將其添加到.vimrc中自動完成。 – Kimvais 2010-01-13 07:52:29

1

因爲你可以在pixdom 看看,看看文檔在pxdom 1.5 A Python DOM implementation

的DOMConfiguration#3選項參數

解析操作 的結果取決於所設定的參數 LSParser.domConfig映射。通過 默認情況下,根據DOM 說明書中,所有CDATA部分將 可以與純文本節點替換和 所有綁定實體引用將是 由實體 的內容替換提及。這包括外部 實體參考和外部 子集。

它包括串行器將文檔保存到一個文件..

0

您正在尋找這樣的事情?

#!/opt/local/bin/python 
import sys 
if len(sys.argv) < 2: 
    print "some files needed." 
    sys.exit() 

final = """ 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<nodes> 
""" 
for a in sys.argv[1:]: 
    ca = a.replace(".xml","") 
    final += "<" + ca + ">\n" 
    infile = open(a) 
    final += infile.read() 
    final += "</" + ca + ">\n" 

final += "</nodes>\n" 

outfile = open("final.xml", "w") 
outfile.write(final) 
outfile.close() 
相關問題