如何高效替换XML的多个节点?

2023-12-24

我试图一次性替换单个文档的大约 500 个节点,并且我的数据库中有 5000 多个文档。

我正在使用的代码与我之前问过的这个问题相关-Link https://stackoverflow.com/questions/51998598/how-to-replace-multiple-nodes-of-xml-in-one-go-data-hub-framework

有什么建议可以使我的代码高效吗?


通常应避免使用 in-mem-update 库,特别是在对同一文档进行多次方法调用时。由于每个方法都会遍历整个节点树并生成一个全新的文档,因此如果您针对大型文档运行和/或对这些文档进行一堆 mem:* 方法调用,则可能会很慢且昂贵。

Ryan Dew 是更好的替代品XQuery XML 内存操作库 https://github.com/ryanjdew/XQuery-XML-Memory-Operations,或使用 XSLT。

下面是如何使用 XSLT 执行这种“合并”的示例,它的性能应该比 in-mem-update 方法更好:

declare variable $STAGING := document{
<root>
 <ID>1</ID>
 <value1>India</value1>
 <value2>USA</value2>
 <value3>Russia</value3>
 <value4>Srilanka</value4>
 <value5>Europe</value5>
 <value6>Antartica</value6>
 <value7>Spain</value7>
</root>
};

declare variable $FINAL := document{
<root>
 <ID>1</ID>
 <value1></value1>
 <value2></value2>
 <value3></value3>
 <value4></value4>
 <value5>Europe</value5>
 <value6>Antartica</value6>
</root>
};

declare variable $XSLT := 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:param name="staging-doc"/>
  <xsl:param name="element-names"/>

  <xsl:variable name="final-doc" select="/"/>

  <xsl:key name="staging-elements" match="root/*[local-name() = $element-names]" use="local-name()"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="root/*[local-name() = $element-names]">
    <!--if there is an element in the staging-elements doc with this name, use it. Otherwise, use the matched element from this doc -->
    <xsl:copy-of select="(key('staging-elements', local-name(.), $staging-doc), .)[1]"/>
  </xsl:template>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <!-- also copy any other elements with the specified names from the staging document that were not already in the final -->
      <xsl:apply-templates select="$staging-doc/root/*[local-name() = $element-names and not(key('staging-elements', local-name(), $final-doc))]"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>;

declare variable $PARAMS := map:new((
    map:entry("staging-doc", $STAGING), 
    map:entry("element-names", tokenize(("value1,value2,value3,value4,value7"), ",") )
  ));

xdmp:xslt-eval($XSLT, $FINAL, $PARAMS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何高效替换XML的多个节点? 的相关文章

随机推荐

  • 如何将Azure机器学习批量评分结果写入数据湖?

    我正在尝试将批量评分的输出写入数据湖 parallel step name batchscoring datetime now strftime Y m d H M output dir PipelineData name scores d
  • ios 上的 ionic firebase 手机身份验证无需重新验证

    我有一个离子应用程序 我使用 firebase 电话身份验证 该身份验证使用 recapcha 它在 android 上运行良好 但在 ios 上抛出错误 提示 recaptcha 只能在 http 环境中运行 我想知道是否有一种方法可以在
  • 方法参考,协方差逆变

    我刚刚发现java 8允许引用具有更具体的返回类型和更通用的参数的方法 import java util function Function public class MethodReferences public static Integ
  • 如何从 @types/jsonwebtoken 添加附加属性到 JwtPayload 类型

    我是打字稿新手 正在尝试移植快速应用程序以使用打字稿 服务器使用 JWT 进行身份验证 授权 我有一个实用程序函数可以解码和验证给定的令牌 该函数被包装在一个承诺中 因此我可以在实现它的中间件中使用 async await import h
  • java.lang.IllegalArgumentException:无法获取数组 的 JDBC 类型

    我想将输出数据导入到mysql数据库中 但是出现以下错误 我不会将数组转换为所需的字符串类型 可以帮助我吗 val Array trainingData testData msgDF randomSplit Array 0 9 0 1 va
  • Google Chrome 颜色选择器没有响应

    Google Chrome 颜色选择器没有响应 我尝试重新安装并重置 Chrome 如何解决这个问题 重置开发工具 并不能解决问题 我不完全确定此错误的确切原因是什么 但唯一可用的修复需要在更新中完成 尽管我没有花太多时间寻找 但我在代码本
  • 尝试使用 Highgui.imread 加载图像(OpenCV + Android)

    我尝试加载图像 File root Environment getExternalStorageDirectory File file new File root image gif Mat m Highgui imread file ge
  • 如何根据标点符号和空格分割字符串?

    我有一个String我想根据标点符号和空格进行分割 的正则表达式参数应该是什么split method 带有一些怪异处理的代码 请注意 它会跳过输出循环中的空标记 这又快又脏 您可以将需要拆分和删除的任何字符添加到正则表达式模式中 tchr
  • 透明背景的颤动角半径

    下面是我的代码 我希望渲染一个具有透明背景的圆角容器 return new Container padding const EdgeInsets all 32 0 height 800 0 color const Color 0xffDC1
  • 为什么堆内存使用量和加载的类数量不断增加?

    我在用JVM Explorer 链接到 JVM 资源管理器 http jvmmonitor org doc index html 来分析我的 Spring 应用程序 我对此有以下问题 为什么 已用堆内存 在申请后仍然不断增加 已启动但尚未收
  • bootstrap 3在模式弹出后禁用背景[重复]

    这个问题在这里已经有答案了 我正在尝试使用下面给定的代码在我的代码中弹出 bootstrap 3 模式 div class modal fade div class modal dialog div class modal content
  • Android Studio-图像显示在设计视图中但不在模拟器中

    我正在学习 android 应用程序开发 因此 当我构建一个简单的应用程序以在屏幕上显示两个图像时 我使用了 ImageView 图像显示在 android studio 设计屏幕中 但是当我尝试使用运行应用程序时genymotion 模拟
  • 多态性(继承)和值类型

    我有很多类型 PixelMeasure PointMeasure CentimeterMeasure等等 表示带有单位的值 我希望他们有 值语义 例如实际上是不可变的 不必担心内存分配 并且 多态性 我可以返回一个类型的对象Measure并
  • 在 Express 中监听 UDP 消息

    我有一个使用 Express 的基本 Node js 服务器 它需要能够处理 TCP 消息以及 UDP 消息 TCP 部分已启动并运行良好 但现在我需要集成一种嗅探 UDP 消息的方法 我尝试使用以下方法将处理程序添加到过滤器堆栈中dgra
  • java中的toArray与stream.toArray有什么性能差异

    我需要将 ids 列表转换为 ids 数组 我可以通过多种方式做到这一点 但不确定应该使用哪一种 Say 1 ids stream toArray Id new 2 ids toArray new Id ids length 哪一种更有效
  • 使用 XmlDocument 保留 xml 格式

    我正在使用 XmlDocument 来处理 xml 如何使用当前格式保存 XmlDocument 当前格式
  • pdb 绕过错误/跳转失败:只能从“行”跟踪事件跳转

    我正在尝试使用 pdb 调试 Python 程序 程序可能是这样的 def main a 1 print b c 2 d 3 显然 print b 是一个拼写错误 应该是 print a 但这并不重要 我可以用文本编辑器修复它 但我想绕过这
  • Linux系统上打印文件的uid

    我正在学习c编程 我正在尝试让我自己的程序类似于ls命令但选项较少 我正在做的是将输入目录 文件名作为参数 然后获取所有目录条目direntstruct 如果是目录 之后我使用 stat 获取文件的所有信息 但是当我使用 write 打印这
  • Node.js:类型错误:对象不是函数

    我有一个奇怪的错误 var http require http var request require request http createServer function request response response writeHe
  • 如何高效替换XML的多个节点?

    我试图一次性替换单个文档的大约 500 个节点 并且我的数据库中有 5000 多个文档 我正在使用的代码与我之前问过的这个问题相关 Link https stackoverflow com questions 51998598 how to