2013-04-12 56 views
0

我想將XML文檔轉換作爲一次性命令和獨立腳本編寫,就像我使用Unix工具(如grep,sed,awk等)來處理文本文件一樣。這些腳本必須在Linux和Windows之間可移植(使用Cygwin即可)。'選擇和轉換'XML轉換語言?

如果你已經定期做這個,你使用什麼解決方案?你能推薦它嗎? 。

(一些背景資料:

現在,我想從一組XML文檔中刪除某種元素的 我經常需要做這種系統的XML文檔的改寫; 有時候,在(在命令行上,我用了很多); 更多的時候,我想要構建更復雜的轉換,將它們保存到文件中,然後從文件中執行它們

所以我想要一個XML轉換腳本語言可以在命令行上使用。 類似sed或針對XML文檔的:其命令將指定一個選擇器,用於選擇輸入文檔中的節點,以及指定如何處理每個選定節點上的文檔的操作。

通常我會用XML::LibXML寫出一個Perl腳本。 這工作,但它確實不適合該法案:

  • 語法:代碼過於冗長要在命令行上
  • 語義上使用:「選擇與改造」模式不給定,我必須明確地編程,這種行爲在我的代碼,因此它是不必要很難讓讀者明白,那就是究竟發生什麼事
  • 語法/語義:讀或寫這個代碼需要在語言一般流暢

The對於使用任何其他通用編程語言也是如此。

嗯,這是XSLT的發明,對不對?

也許; I can use XSLT,但它確實遭受同樣的缺點。

更好的匹配是xmlstarlet:它確實就像sed,因爲它支持我想要的類型的簡短而神祕的命令。但是,就像sed一樣,從這些命令組成的大型程序也很難理解。

另一個想法是使用jQuery DOM manipulation

  • 更強大的選擇比的XPath
  • 優雅和緊湊的方式相結合的選擇和操作
  • 內置任意JavaScript函數的可擴展性(但沒有按」 t 要求對於簡單情況下的很多JavaScript知識)

好,但我你要用一個工具,它允許我用這樣的表達作爲獨立的腳本:

jqmanip --html '$(a:parent).detach()' foo.html > bar.html 
jqmanip convert-tables-to-divs.jqm foo.html > bar.html 

這是排序實用程序我在找的)

+0

更新:我剛剛發現了另一種這樣的語言:[XDT](http://msdn.microsoft.com/en-us/library/dd465326.aspx)。 – reinierpost

回答

0

現在,我使用的/bin/sh組合和xmlstarlet,e ..g。

#!/bin/sh 
# 
# csproj2csproj - clean up VS 2010/2012 C# project files in various ways 
# 
# $Id$ 

dft='//*[local-name()="PropertyGroup" and not(@Condition)]' 
dbg='//*[local-name()="PropertyGroup" and contains(*/@Condition,"Debug")]' 
rel='//*[local-name()="PropertyGroup" and contains(*/@Condition,"Release")]' 

RemoveTree() 
{ 
    xmlstarlet ed -d "$1" 
} 

AppendAsLastChild() 
{ 
    xmlstarlet ed -i "$1"'/*[last()]' -t elem -n "$2" -v "$3" 
} 

sed 's/encoding="utf-8"/encoding="Windows-1252"/' "[email protected]" | 
RemoveTree '//*[@Include="My Project\"]' | 
RemoveTree '//*[not(@*|*) and not(normalize-space(.))]' | 
RemoveTree '//*[local-name()="LangVersion"]' | 
RemoveTree '//*[local-name()="CheckForOverFlowUnderFlow"]' | 
RemoveTree '//*[local-name()="DocumentationFile"]' | 
AppendAsLastChild "$dft" LangVersion ISO-2 | 
AppendAsLastChild "$dbg" CheckForOverflowUnderflow true | 
AppendAsLastChild "$rel" CheckForOverflowUnderflow false | 
AppendAsLastChild "$rel" DocumentationFile 'bin\Release\vsdocs.xml'