使用XML复制编辑器进行XML操作

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值