jQuery XML:计算叶节点的数量

时间:2011-02-01 16:19:08

标签: javascript jquery xml

如何使用jQuery计算来自特定XML节点的叶节点数? 有问题的XML看起来与此类似。我希望所有叶节点都离开<Errors>节点。

<Errors>
    <ErrorParentCat>
        <ErrorTag/>
        <ErrorTag2/>
    </ErrorParentCat>
</Errors>

在此示例中,我只想计算<ErrorTag/><ErrorTag2/>。因此结果应为2。另外<ErrorParentCat>是一个示例标记,<Errors>中可能有许多名称不同。

如果有了数字,我也想要这些叶子节点的列表,如果可能的话。

2 个答案:

答案 0 :(得分:3)

假设您已经有一个名为XMLDocument的{​​{1}}:

xml

您也可以直接将XML字符串传递给jQuery函数:

var $xml = $(xml),
    count = $xml.find('*').filter(function ()
    {
        return $(this).children().length === 0;
    }).length;
console.log(count);

jsfiddle demo →


编辑 您说您想要一个这些叶节点的列表。在上面的代码中,您已经获得了它们:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>');
// the rest is the same
正如Tim Down所指出的那样

编辑#2 (请参阅下面的评论),您不能只将XML字符串传递给IE中的var $xml = /* whatever */, $leafNodes = $xml.find('*').filter(function () { return $(this).children().length === 0; }), count = $leafNodes.length; (!@ #$ ing IE)。您应该使用jQuery 1.5函数$.parseXML()将任意格式良好的XML字符串解析为$()

XMLDocument

new jsfiddle demo →

答案 1 :(得分:1)

有很多方法可以做到这一点:

var countThem = 0;

    jQuery.ajax({
        type: "GET",
        url: 'blahblah.xml',
        dataType: ($.browser.msie) ? "text/xml" : "xml",
        success: function(xml) {
            var xml2 = load_xml(xml);
            $(xml2).find('Errors').each(function(){
                $(xml2).find('ErrorParentCat').each(function(){
                    alert($(this).text()); //alert the contents
                    countThem++;
                });
            });
            alert(countThem); //alert the total number
        }
    });

和XML加载函数:

function load_xml(msg) {   
     if ( typeof msg == 'string') {
        if (window.DOMParser)//Firefox
          {
            parser=new DOMParser();
            data=parser.parseFromString(text,"text/xml");
        }else{ // Internet Explorer
           data=new ActiveXObject("Microsoft.XMLDOM");
           data.async="false";
           data.loadXML(msg);
       }
     } else {
        data = msg;
     }
    return data;
}