0

我想将 XML 文档转换编写为一次性命令和独立脚本,就像我使用 Unix 工具(例如grepsedawk等)来操作文本文件一样。脚本必须可在 Linux 和 Windows 之间移植(使用 Cygwin 即可)。

如果您已经定期执行此操作,您使用什么解决方案?你能推荐它吗?

(一些背景:

现在,我想从一组 XML 文档中删除某种元素。我经常需要进行这种系统的 XML 文档重写;有时,在运行中(在命令行上,我经常使用);更多时候,我想构建更复杂的转换,将它们保存到文件中,然后从文件中执行它们。

所以我想要一种可以在命令行上使用的 XML 转换脚本语言。类似于 XML 文档的东西sedawk它的命令将指定一个选择器,用于选择输入文档中的节点,以及一个操作,该操作指定在每个选定节点处对文档进行什么操作。

通常,我会退缩并使用XML::LibXML编写 Perl 脚本。这行得通,但它确实不符合要求:

  • 语法上:代码过于冗长,无法在命令行上使用
  • 语义上:没有给出“选择和转换”模式,我必须将这种行为明确地编程到我的代码中,所以读者很难理解这是真正发生的事情
  • 句法/语义:阅读或编写此代码需要语言流利

使用任何其他通用编程语言也是如此。

嗯,这就是 XSLT 的发明目的,对吧?

也许; 我可以使用 XSLT,但它确实有同样的缺点。

一个更好的匹配是xmlstarlet:它真的很像sed,因为它支持我想要的类型的简短、神秘的命令。然而,就像使用 sed 一样,由这些命令组成的大型程序很难理解。

另一个想法是使用jQuery DOM 操作

  • 比 XPath 更强大的选择器
  • 优雅而紧凑的方式将选择和操作结合起来
  • 具有任意 JavaScript 函数的内置可扩展性(但对于简单的情况不需要太多 JavaScript 知识)

太好了,但我需要一个实用程序来允许我将这些表达式用作独立脚本:

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

这就是我正在寻找的那种实用程序。)

4

1 回答 1

0

现在我正在使用/bin/shand的组合xmlstarlet,例如

#!/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"/' "$@" |
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'
于 2013-05-02T16:29:25.440 回答