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