如何将XML对象与jQuery/JavaScript合并

How to merge XML objects with jQuery / JavaScript

本文关键字:jQuery JavaScript 合并 对象 XML      更新时间:2023-09-26

我想将不同XML文件的数据合并到一个大的XML树中。我的想法是将所有即将到来的节点附加到第一个XML文件的根节点。然而,当我试图调用"mergedXml.documentElement.appendChild"时,我得到了一个"TypeError"。这是我的代码:

var mergedXml = undefined;
$.each(files, function(index, value) {
  $.ajax({
    url: value,
    cache: true,
    async: false,
    dataType: 'text',
    success: function(data) {
      var xmlDocument = $.parseXML(data);
      if (typeof mergedXml === 'undefined') {
        mergedXml = xmlDocument;
      } else {
        // New children
        var childNodes = xmlDocument.documentElement.childNodes;
        var children = childNodes.length;
        for (var i = 0; i < children; i++) {
          var node = childNodes[i];
          // How to append these nodes to the mergedXml root?
          // I tried:
          // mergedXml.documentElement.appendChild(node);
          // But then I get...
          // TypeError: Argument 1 of Node.appendChild is not an object. 
        }
      }
    }
  });
});

也许你能帮我?

我怀疑您收到的错误是由Node.appendChild从原始父节点中删除节点这一事实引起的,因此您试图访问已经不存在的节点。我建议将for循环替换为while循环:

var node;
while (xmlDocument.documentElement.hasChildNodes()) {
    node = xmlDocument.documentElement.childNodes[0];
    mergedXml.documentElement.appendChild(node); 
}

完整解决方案:

  var mergedXml = undefined;
  $.each(files, function(index, value) {
    $.ajax({
      url: value,
      cache: true,
      async: false,
      dataType: 'text',
      success: function(data) {
        var xmlDocument = $.parseXML(data);
        if (typeof mergedXml === 'undefined') {
          // Init XML collection
          mergedXml = xmlDocument;
        } else {
          // Add new children to XML collection
          var node;
          while (xmlDocument.documentElement.hasChildNodes()) {
            node = xmlDocument.documentElement.childNodes[0];
            mergedXml.documentElement.appendChild(node);
          }
        }
        if (index === files.length - 1) {
          console.log('Total nodes in root: ' + mergedXml.documentElement.childNodes.length);
        }
      }
    });
  });