2013-04-12 57 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'