Javascript jQuery XML:计算叶节点数

Javascript jQuery XML:计算叶节点数,javascript,jquery,xml,Javascript,Jquery,Xml,我如何使用jQuery计算从特定XML节点中产生的叶节点数? 所讨论的XML与此类似。我希望所有叶节点都来自节点 <Errors> <ErrorParentCat> <ErrorTag/> <ErrorTag2/> </ErrorParentCat> </Errors> 在本例中,我希望只计算和。因此,结果应该是2。另外,是一个示例标记,在中可能有许多具有不同名称的标记

我如何使用jQuery计算从特定XML节点中产生的叶节点数? 所讨论的XML与此类似。我希望所有叶节点都来自
节点

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

在本例中,我希望只计算
。因此,结果应该是
2
。另外,
是一个示例标记,在
中可能有许多具有不同名称的标记


一旦我有了号码,如果可能的话,我也想要这些叶节点的列表。

假设您已经有一个名为
xml
XMLDocument

var $xml = $(xml),
    count = $xml.find('*').filter(function ()
    {
        return $(this).children().length === 0;
    }).length;
console.log(count);
您也可以直接将XML字符串传递给jQuery函数:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>');
// the rest is the same
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;
}   
Edit#2正如Tim Down所指出的(参见下面的评论),您不能在IE(!@#ing IE)中将XML字符串传递给
$()
。您应该使用jQuery 1.5函数将任意格式良好的XML字符串解析为
XMLDocument

var xmlDoc = $.parseXML('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>'),
    $xml = $(xmlDoc);
/* the rest is unchanged */
var xmlDoc=$.parseXML(“”),
$xml=$(xmlDoc);
/*其余的不变*/

假设您已经有一个名为
xml
XMLDocument

var $xml = $(xml),
    count = $xml.find('*').filter(function ()
    {
        return $(this).children().length === 0;
    }).length;
console.log(count);
您也可以直接将XML字符串传递给jQuery函数:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>');
// the rest is the same
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;
}   
Edit#2正如Tim Down所指出的(参见下面的评论),您不能在IE(!@#ing IE)中将XML字符串传递给
$()
。您应该使用jQuery 1.5函数将任意格式良好的XML字符串解析为
XMLDocument

var xmlDoc = $.parseXML('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>'),
    $xml = $(xmlDoc);
/* the rest is unchanged */
var xmlDoc=$.parseXML(“”),
$xml=$(xmlDoc);
/*其余的不变*/

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

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加载函数:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>');
// the rest is the same
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;
}   

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

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加载函数:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>');
// the rest is the same
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;
}   

谢谢,但是我应该指定,
ErrorParentCat
是一个例子,虽然可能有很多种,除了那一点点之外,它还不错:)谢谢,但是我应该指定,
ErrorParentCat
是一个例子,虽然可能有很多种,除了那一点点之外,它还不错:)为答案干杯,在我看到你的更新之前,我自己修改了代码:)@Chris:我想这不是你所能理解的,但我会尽可能清楚地回答。不客气。不,不能将XML直接传递到jQuery函数中。jQuery假定它处理的是HTML,而不是将其解析为XML。然而,jQuery1.5确实有一个
parseXML()
方法:@Tim:您可能会注意到我发布的JSFIDLE示例工作正常,并且完全按照您所说的做。也就是说,您可能认为最好在IE中使用
$.parseXML()
@Matt:不是这样。说真的,建议使用
$()
解析XML是不好的:它不是为解析XML而设计的,它不工作,jQuery现在提供了一个函数来完成它。为答案喝彩,在看到您的更新之前我自己修改了代码:)@Chris:我想这并不超出您的能力范围,但我会尽可能清楚地回答。不客气。不,不能将XML直接传递到jQuery函数中。jQuery假定它处理的是HTML,而不是将其解析为XML。然而,jQuery1.5确实有一个
parseXML()
方法:@Tim:您可能会注意到我发布的JSFIDLE示例工作正常,并且完全按照您所说的做。也就是说,您可能认为最好在IE中使用
$.parseXML()
@Matt:不是这样。说真的,建议使用
$()
解析XML是不好的:它不是为解析XML而设计的,它不起作用,jQuery现在提供了一个函数来解析XML。