XML文档格式创建于1996年,至今仍被广泛用于促进异构系统之间的通信(尽管对于某些实现而言,JSON已被某些形式所取代)。 作为Java开发人员,我通常通过DOM解析器与XML文档中的数据进行交互,但是在某些情况下,能够直接操作XML文档是有利的,甚至是必要的。
在不太可能的情况下,如果所讨论的文档特别小,但通常这些文档可能很大,则可以使用简单的文本编辑器来实现。 因此,能够在专门为该类型的工作设计的程序中操作文档将是有益的。
就我而言,我不需要经常做这种事情来证明购买这样的软件是合理的,但是我发现XML Copy Editor已经免费满足了我的需求。
我正在从事的项目通过SOAP调用与另一家供应商软件进行通信。 有时,供应商软件的行为不符合预期,数据被破坏,必须予以修复。 没有办法通过客户端的UI来简化此过程,解决方案是直接处理XML数据,并通过SOAP调用将其返回给供应商系统。 此过程通常涉及几条数据,这些数据由位置(在本例中为状态)描绘。 这些文件的最大大小为10 MB,并包含所有50个州的条目。 以我的经验,XML Copy Editor在处理大文件方面从未有过任何挣扎,这是非常有益的。
在接下来的段落中,我将不仅描述XML Copy Editor,而且还将提供XML / XSLT / XPATH的快速教程。 以下面的示例为例,它是我通常使用的文件类型的简化表示:
<Header1>
<Header2>
<Detail>
<State>
<Name>Missouri</Name>
</State>
<SubDetail>
<Premium>500</Premium>
</SubDetail>
</Detail>
<Detail>
<State>
<Name>Kansas</Name>
</State>
<SubDetail>
<Premium>600</Premium>
</SubDetail>
</Detail>
</Header2>
</Header1>
通常,在XML复制编辑器中打开文件时,我要执行的第一步操作是执行“ XML→漂亮打印”功能(F11),因为该文件通常用于系统之间的通信,而不是人类可读性。 “漂亮的打印”使用适当的换行符和缩进来格式化文档,从而使其更易于阅读和解释。
现在,为了找到需要更改的数据,我们使用XPath。 在这种情况下,我们要寻找的是密苏里州的“高级”元素。 从访问“ Pretty Print”的同一菜单中,我们还可以访问“ XML→Evaluate XPath…”(F9),这为我们提供了一个包含单个文本输入字段的模式对话框。 我们输入的XPath语句是“ \\ Header1 \ Header2 \ Detail \ SubDetail \ Premium”。 让我们解析这个XPath,对吧?
这句话很简单; 简而言之,它说返回带有祖先的每个节点:“ Header1→Header2→Detail→SubDetail→Premium”。 但是,这将返回密苏里州和堪萨斯州的两个“ Premium”节点,这不是我们想要的。 请记住,每个XPath语句都有可能返回多个结果。 开发人员应使语句足够简洁以返回所需结果。 换句话说,每个XPath语句都会发出请求,“给我所有符合此条件的元素。” 因此,我们通过以下方式改进此语句:
“\\Header1\Header2\Detail\SubDetail\Premium[../../../@State='Missouri']”.
在此语句末尾添加“ [../../../@State='Missouri']”可能会有些混乱,但这是XPath的非常有价值的一部分。 “ @ State ='Missouri'”是一个限定词,表示要返回Premium元素,其中共享祖先中“ State”节点的值等于“ Missouri”。 如果“状态”节点是“高级”的子级,则该语句应如下所示:
“\\Header1\Header2\Detail\SubDetail\Premium[@State='Missouri']”
但是,由于“状态”节点在祖先上位较高,并且是XPath上的元素之一(第二个“策略”节点)的同级,因此限定符必须“后退”以识别XML中的位置“状态”节点驻留。 限定词中的每个“ ../”都是向上的一步。 可以将其视为类似于Windows命令行中的“ cd ..”。
现在我们已经找到了要更改的数据,我们必须对其进行更改。 XPath本身不能做到这一点,但是结合使用XPath和XSLT可以实现我们的目标。 XSLT通过读取由“模板”定义的规则来“转换” XML文档,这些模板在单独的XSLT文件中定义。 XSLT文件的格式与XML非常相似。 我们可以在XML复制编辑器中创建XSLT文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:XSL="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="\\Header1\Header2\Detail\SubDetail\Premium[@State='Missouri']">100</xsl:template>
</xsl:stylesheet>
然后,我们从菜单中启动“ XML→XSL Transform…”(F8)操作。 这为我们提供了一个打开文件对话框,从中选择我们刚定义的XSL文件。 这将产生一个具有以下内容的新XML文档:
<Header1>
<Header2>
<Detail>
<State>
<Name>Missouri</Name>
</State>
<SubDetail>
<Premium>100</Premium>
</SubDetail>
</Detail>
<Detail>
<State>
<Name>Kansas</Name>
</State>
<SubDetail>
<Premium>600</Premium>
</SubDetail>
</Detail>
</Header2>
</Header1>
那么,这是如何工作的呢? 好吧,在XSL文件中定义了两个“模板”。 模板将定义的规则应用于指示的XML。 在这种情况下,第一个模板指示将整个XML复制到输出文件。 第二个模板指示将指示的XPath处的节点的值更改为定义的值。
我们终于得到它了。 希望对您有所帮助! 如有任何疑问,请发表评论。
翻译自: https://www.javacodegeeks.com/2015/02/xml-manipulation-xml-copy-editor.html