Xembly, an Assembly for XML

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

我在几乎每个项目中都使用XML。尽管有关JSON/YAML的讨论很多,但我真诚地认为XML是有史以来最伟大的语言之一。而且,我认为XML的美妙之处在于与相关技术的结合使用。

例如,您可以使用XSL样式表将数据以XML形式展示并呈现给最终用户。

另一个例子是在呈现之前验证相同的数据以确保结构正确。您可以使用XSD模式进行验证。或者,您可以使用XPath查询从整个文档中选择特定的数据元素。

基本上,XSL、XSD模式和XPath这三种技术使XML如此强大。

然而,有时候XML可能不够用。例如,想象一下您需要稍微修改一个现有文档的情况。例如,让我们使用以下示例:

上面的代码表示了一个账户列表。每个账户都有自己的id和多个子元素。在我们的例子中,我们需要找到属于Jeffrey的账户,并将其余额增加500。我们应该如何做到这一点?

嗯,有几种可能的解决方案:

  • DOM-parse it, find the element with XPath, change the value and then print it;

解析DOM,使用XPath找到元素,更改值,然后打印出来;

  • 应用一个参数化的XSL样式表;

  • 应用XQuery小脚本进行更改。

所有这些方法都有各自的缺点。然而,它们都有一个共同的问题——它们非常冗长。使用上述任何一种方法,您至少需要一页的代码来执行这个相当简单的操作。此外,如果操作的逻辑变得更加复杂,所需的代码量会比您预期的增长得更快。

简而言之,XML缺乏在文档中进行原始数据操作的工具。也许,正是这个缺点使得XML在某些方面不受欢迎。

无论如何,这是我几个月前创建的一个工具:Xembly。它是一种命令式语言,具有几个简单的指令,类似于汇编语言的风格。因此,它的名字叫Xembly。使用Xembly,没有循环、条件或变量,只有一系列带参数的指令。

让我们创建一个简单的示例。例如,假设我们想向我们的列表文档中添加一个新的账号号码36。代码将如下所示:

以上应该是很直观清楚的,但我还是给出解释。首先,XPATH指令将我们定位到由”/accounts” XPath查询找到的元素。这将成为我们的根元素。我们在这里假设它在文档中存在。因此,如果它不存在,我们的Xembly脚本将会因为运行时异常而失败。

接下来,第2行的ADD指令创建一个没有任何子元素或属性的新XML元素。然后,ATTR指令为该元素设置一个属性。接着,代码添加了新的子元素name并使用SET指令将其文本值设置为"Donny"。最后,我们使用UP将指针移回到account元素,添加balance子元素并将其值设置为"3400"

我们的余额变动任务可以用以下代码在Xembly中表示:

XSET指令设置元素的文本值,类似于SET,但通过提供的XPath表达式. + 500预先计算。

Xembly通过DOM执行所有操作。因此,可以在任何具有内置DOM实现的语言中实现Xembly。

与此同时,Xembly语言只有一种实现方式—Java。以下是它的工作原理:

在这个代码片段中,我使用了一个补充脚本构建器“Directives”,它可以以流畅的方式生成指令。然后,我使用了“Xembler”类,它类似于“assembler”,将所有指定的指令应用于类“org.w3c.dom.Document”的“document”对象。

此外,Xembly还可以用于从零开始构建XML文档,并作为传统DOM构建的替代方法。一个快速示例:

上述代码片段生成以下输出:

对我来说,这似乎更简单和紧凑。

如往常一样,欢迎您的错误报告和建议。请发送至GitHub问题

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-15 at 06:21

sixnines availability badge   GitHub stars