首页 > 解决方案 > xml builder root 正在跟踪以前的值并复制结果,但也无法使其为空

问题描述

我尝试搜索答案,但由于 XMLBUILDER 上的问题数量有限,无法找到。因此,如果发现重复问题,真的很抱歉。

我正在使用XMLBUILDERNode.js 模块为我的项目创建 XML。我有一个可以为我创建 XML 的函数,但由于某种原因,该root元素总是存储以前的值,因此每次 XML 都会附加以前的值,我得到它两次。

这是创建 XML 的 Node.js 控制器:

var root    =   builder.create('Header')
                    root.att(currentTime)

exports.createXMLData   =   function(Query,callback){
    var input           =   Query.input;    
    var OuterTag        =   root.ele(input.Type)
    
    //Add the time to XML 
    OuterTag.ele('time', input.EventTime).up()
    
    //Add the reason to the XML
    OuterTag.ele('reason',input.ErrorReason)
    
    //Like this I have many more tags
    
    xml = root.end({ pretty: true});
    callback(xml);
}

我有一个包含一组值的数组,我需要创建一个 XML 来附加所有值,所以我将其放置在root外部,因为我不希望每次都添加标题。对于数组中的每个元素,我将调用该函数createXMLData,以便可以创建所需的 XML,并且可以将自己附加到 XML,但是每次调用此函数时,它都会跟踪以前的值,并且我会得到新的值以前的值。

例如:如果我在数组中有 2 个元素并单击 SUBMIT 按钮以创建 XML,那么首先它会使用 2 个元素正确创建 XML,但是当我再次单击它时,它将再次创建 XML 以及以前的值所以我会得到4个元素。

我知道如果将root标签放在函数中,那么我会为数组中我不想要的每个元素获取两次 Header。我只想为整个 XML 提供 1 个标头。我尝试使用函数内的 清空根元素,root = ""但它会引发一些错误。

我确信这是我遗漏的一些小东西,但我无法弄清楚。有人可以帮我吗?

因此,当我第一次创建时,我会得到类似这样的 XML:

<?xml version="1.0"?>
<header>
    <time> 2020-08-20T09:35:25+02:00 </time>
    <reason> dummyReason </reason>
    
    <time> 2020-08-20T09:35:30+02:00 </time>
    <reason> dummyReason </reason>
</header>

如果我通过单击提交按钮再次创建,那么我会得到如下信息:

<?xml version="1.0"?>
<header>
    <time> 2020-08-20T09:35:25+02:00 </time>
    <reason> dummyReason </reason>
    
    <time> 2020-08-20T09:35:30+02:00 </time>
    <reason> dummyReason </reason>
    
    <time> 2020-08-20T09:36:25+02:00 </time>
    <reason> dummyReason </reason>
    
    <time> 2020-08-20T09:36:30+02:00 </time>
    <reason> dummyReason </reason>
</header>

请注意,我不是每次调用数组元素时都附加元素。这是由root元素自动完成的。

标签: javascriptnode.jsxmlxml-builder

解决方案


您能否提供一个示例,说明 XML 现在如何在您的代码中输出以及您希望它如何输出?因为我并不清楚确切的问题是什么。你想追加但你不想:-)

更新: 我想我更清楚地理解了这个问题。我建议创建一个生成 XML 根对象的辅助函数。提交值时,您可以通过创建一个空的新对象来“重置” XMLBuilder 对象。

var builder = require("xmlbuilder");

function setupXML(currentTime) {
  var root = builder.create("Header");
  root.att(currentTime);
  return root;
}

function createXMLData(xmlRoot, query) {
  xmlRoot.ele(query.time);
  xml = xmlRoot.end({ pretty: true });
};

var items = [
  {
    time: "time1",
  }
];

var currentTime = 'value';
var root = setupXML(currentTime);

items.forEach((item) => {
  createXMLData(root, item);
});

推荐阅读