4

XML ファイルがあります。

    <?xml version="1.0" encoding="ISO-8859-1"?>
<childrens>
 <child id="1" value="Root Catalog" parent_id="0">
  <child id="2" value="Apparel" parent_id="1">
    <child id="3" value="Accessories" parent_id="2">
        <child id="4" value="Handbags" parent_id="3">
            <child id="5" value="Jewelry" parent_id="4"/>
            <child id="6" value="test1" parent_id="4"/>
            <child id="7" value="test2" parent_id="4"/>
            <child id="15" value="test3" parent_id="4"/>
        </child>
    </child>
  </child>
  <child id="8" value="test_A" parent_id="1">
    <child id="9" value="test_B" parent_id="8">
        <child id="10" value="test_C" parent_id="9">
            <child id="11" value="test_D" parent_id="10"/>
        </child>
    </child>
  </child>
  .
  .
  .
  .
  .
  .
  <child id="1111" value="test" parent_id="1">
    <child id="1112" value="test1" parent_id="1111">
        <child id="1113" value="test12" parent_id="1112">
            <child id="1114" value="test123" parent_id="1113"/>
            <child id="1115" value="test1234" parent_id="1114"/>
        </child>
    </child>
    <child id="1116" value="test12345" parent_id="1111"/>
  </child>  
 </child>
</childrens>

特定のノードのすべての子孫(葉ノードまでのすべての子)を検索したいと考えています。たとえば、ここtestの子孫はtest1,test12,test123,test1234 & test12345

の子孫が見つかった場合test1、結果は になりますtest12,test123,test1234

$(document).ready(function(){
$.ajax({
    type: "GET",
    url: "test.xml",
    dataType: "xml",
    success: function(xml) {
        $(xml).find('child[value="test"]').children().each(function(){
            var i = $(this).attr('value');
            alert(i);

        });
    }
});
});

jQuery を使用すると、.children()そのノードの直接の子のみが得られます。孫には与えません。たとえば、testアラートのみが表示されtest1 & test12345ます。

4

2 に答える 2

1

事前注文トラバーサルを実行することでそれを達成できます。その再帰関数の魔女は、ノードを必要な順序で処理します。jQueryで簡単なプレオーダーDOMツリートラバーサルアルゴリズムを作成する方法を参照してください。

@ k-primeの答えを考えると、あなたの例は次のようになります。

$(xml).find('child[value="test"]').children().each (function processNodes()
{
    alert($(this).attr('value'));
    if (this.nodeType != 3)
        $(this).children().each(processNodes);
});

JsFiddle

分離された機能として:

function recursiveDescendantsValues(node, arr) {
    node.children().each(function () {
        arr.push($(this).attr('value'));
        if ($(this).nodeType != 3) {
            recursiveDescendantsValues($(this), arr);
        }
    });
}
jQuery.fn.descendantsValues = function() {
    var arr = []
    recursiveDescendantsValues($(this), arr);
    return arr;
};

JsFiddle

それが役に立てば幸い!

于 2013-02-02T10:05:15.633 に答える
0

より素人で原始的な方法で、あなたはこのようにすることができます:

    function iterative_logger(root, t) {
        if (t > 0) console.log(root.attr('value'));
        //console.log("Traversing : " + root.attr('value')+"\n");
        var root_children = $(root).children();
        //console.log("Found " + root_children.length + " children\n");
        if (root_children.length > 0)
            root_children.each(function () {
                t++;
                //console.log("\t" + $(this).attr('value'));
                iterative_logger($(this), t);
            });
    }
    $(document).ready(function () {
        $.ajax({
            type: "GET",
            url: "test.xml",
            dataType: "xml",
            success: function (xml) {
                iterative_logger($(xml).find('child[value="test"]'), 0);
            }
        });
    });

これにより、特定のノード「ルート」のすべての子孫ノードが再帰的に計算されます。

于 2013-02-02T12:13:26.927 に答える