You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SuiteScript 2.1中提取并合并XML的OrderLevel节点(含标签)

SuiteScript 2.1合并XML文件中OrderLevel节点的问题

原需求

我需要找到SuiteScript 2.1里从XML文件提取所有带标签和值的OrderLevel标签的最佳实践方法,目标是把多个XML文件中的OrderLevel标签合并到单个XML文件中,保留所有标签和值。之前考虑过正则,但想采用更规范的方式。

示例XML片段:

<RootLevel>
  <OrderLevel>
    <PurchaseOrderNumber>123</PurchaseOrderNumber>
      <item>fridge</item>
    <PurchaseOrderDate/>
    <Vendor>abc</Vendor>
  </OrderLevel>
  <OrderLevel>
    <PurchaseOrderNumber>456</PurchaseOrderNumber>
      <item>cupboard</item>
    <PurchaseOrderDate/>
    <Vendor>def</Vendor>
  </OrderLevel>
</RootLevel>

问题现状

采纳建议后我写了以下SuiteScript代码,但运行时遇到错误:SSS_XML_DOM_EXCEPTION WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it,想知道问题出在哪里。

代码如下:

// file to copy from
var childFile = file.load({id: value.fileId});
var childXmlContents = childFile.getContents();
log.debug('childXmlContents',childXmlContents);
var childXmlData = xml.Parser.fromString({text: childXmlContents});

//file to copy to
var parentFile = file.load({id: value.parentFileId});
var parentXmlContents = parentFile.getContents();
log.debug('parentXmlContents',parentXmlContents);
var parentXmlData = xml.Parser.fromString({text: parentXmlContents});

//Capture root node from parent file: We aim to copy node from child file.
const parentRootNode = parentXmlData.getElementsByTagName('RootLevel')[0];

//Capture orderLevel node from child file
var orderXMLElement = childXmlData.getElementsByTagName({tagName: 'OrderLevel'});

//Loop through each orderLevel node of child file, COPY node, then append to root of parent file    
for (var i = 0; i < orderXMLElement.length; i++) {
     var x = childXmlData.getElementsByTagName('OrderLevel')[i];
     var getCloneNode = x.cloneNode(true);
     parentRootNode.appendChild(getCloneNode);
}

//Return parent XML as string and save file
const newFileStr = xml.Parser.toString({document: parentXmlData});
const xmlFile = createXMLFile(parentFile.name, newFileStr, 6485323);
const xmlFileId = xmlFile.save();

错误原因及修复方案

这个错误的核心原因是:你从子XML文档克隆的OrderLevel节点属于子文档的DOM树,直接添加到父文档的DOM树中会跨文档引用,违反了DOM规范。

解决方法是使用父文档的importNode方法,先将子文档的节点导入到父文档的上下文,再执行添加操作。修改后的循环代码如下:

//Loop through each orderLevel node of child file, IMPORT node, then append to root of parent file    
for (var i = 0; i < orderXMLElement.length; i++) {
     var x = childXmlData.getElementsByTagName('OrderLevel')[i];
     // 先将节点导入到父文档,第二个参数true表示导入所有子节点
     var importedNode = parentXmlData.importNode(x, true);
     parentRootNode.appendChild(importedNode);
}

关键说明

  • importNode方法会创建一个属于目标文档的新节点副本,保留原节点的所有结构和数据,这样就不会出现跨文档的DOM引用问题。
  • 第二个参数设为true是深度导入,会把OrderLevel下的所有子节点(比如PurchaseOrderNumber、item等)一起导入,确保完整保留原节点内容。

内容的提问来源于stack exchange,提问作者Arif WB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:13:17