如何在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
相关产品推荐
相关产品推荐

