按标记名

时间:2015-06-11 12:04:21

标签: javascript jquery xml

在这个问题上被困了几个小时之后,我认为现在是时候寻求帮助了。

情况

我有一个XML文件,我需要过滤和分组。我设法使用:Contains部分对其进行过滤。我还确定了我需要分组的节点(getGroups函数将这些节点反馈给我)。现在我想创建一个带有过滤值的新XML,并按返回的键分组。

代码

var XMLElement = document.createElement("DataElementsCalc");
jQuery(xml).find("DataElements " + topNodes + filter).each( function() {
    var dataSetTemp = this.parentNode;

    if(calculation1 != "")
    {
        var groupKeys = getGroups(dataSetTemp,calculation1);
        var tempXML = XMLElement;
        jQuery(groupKeys).each(function (key,value) {
            var tempValue = 'a' + value.toLowerCase().replace(/\W/g, '');
            if(tempXML.getElementsByTagName(tempValue).length > 0)
            {
                tempXML = tempXML.getElementsByTagName(tempValue);
            }
            else
            {
                var Node = document.createElement(tempValue);
                tempXML.appendChild(Node);
                tempXML = Node;
            }
        });

        var Node = document.createElement("InfoSet");
        var x = dataSetTemp.childNodes;
        for (i=0; i < x.length; i++)
        {
            if(x[i].nodeType == 1)
            {
                var tempElement = document.createElement(x[i].nodeName);
                tempElement.innerHTML = x[i].childNodes[0].nodeValue;
                Node.appendChild(tempElement);
            }
        }
        tempXML.appendChild(Node);
    }
});

说明

如上所述,我已经过滤了XML并拥有getGroups函数中的groupNames。我还需要为此代码解释一些其他内容:

  • tempValue正在构建为a + value.toLowerCase().replace(/\W/g, '');。这样做是因为我可以将日期记录到groupKeys中。这样节点名称就会得到一个工作名称(我在其他方面收到了错误)。
  • 我想创建一个由组调整的新XML。如果一个组已经存在,我想在其中创建一个新元素,而不是获得一个具有相同名称的新组。 (我现在的问题)。

问题

如上所述,未正确检查这些组。首先:tempXML.getElementsByTagName(tempValue).length返回函数tempXML.getElementsByTagName不存在的错误。其次:如果我将其更改为document.getElemetsByTagName,我的XML文件中会有很多相同的节点。

效果

分组效果并非如此。我得到了一个错误,或者我的DataElementsCalc中有很多相同的节点。

问题

我该如何解决这个问题?如何在特定节点下创建节点(如果在组1下面和组2下面都有组A)?

试过

在不同位置将tempXML更改为document(所有getElementsByTagName,同时或不同)。寻找另一种方法来创建一个更容易处理的XML(尚未找到一个)

1 个答案:

答案 0 :(得分:0)

正如我自己在问题的评论中提到的那样:

  

我也没有在源代码中看到任何内容(也许这就是为什么它不起作用?)

我尝试将XMLElement放入我网页上的现有元素中(如下所示:

var XMLElement = document.createElement("DataElementsCalc");
jQuery('.basicData').append(XMLElement);

其中basicData是现有元素的类。)

现在我获得了我想要的群组上订购的所有元素的列表。

最终版

var XMLElement = jQuery("<DataElementsCalc/>");
jQuery('.basicData').append(XMLElement);
jQuery(xml).find("DataElements " + topNodes + filter).each( function()
{
    aantalElementsTotal++;
    var dataSetTemp = this.parentNode;

    if(calculation1 != "")
    {
        var groupKeys = getGroups(dataSetTemp,calculation1);
        var tempXML = XMLElement;
        var groupId = '';
        jQuery(groupKeys).each(function (key,value) {
            var tempValue = 'a' + value.toLowerCase().replace(/\W/g, '');
            groupId += 'a' + value.toLowerCase().replace(/\W/g, '');
            if(jQuery("#" + groupId).length > 0)
            {
                tempXML = jQuery("#" + groupId);
            }
            else
            {
                var Node = jQuery("<"+tempValue+"/>");
                jQuery(Node).attr('id', groupId);
                jQuery(tempXML).append(Node);
                tempXML = Node;
            }
        });

        var Node = jQuery("<InfoSet/>");
        var x = dataSetTemp.childNodes;
        for (i=0; i < x.length; i++)
        {
            if(x[i].nodeType == 1)
            {
                var tempElement = jQuery("<"+x[i].nodeName+"/>");
                jQuery(tempElement).text(x[i].childNodes[0].nodeValue);
                jQuery(Node).append(tempElement);
            }
        }
        jQuery(tempXML).append(Node);
    }
});