jquery ajax响应,遍历XML来构建嵌套菜单树

时间:2012-05-23 02:50:24

标签: jquery xml ajax filter traversal

我正在努力解决这个问题,我正在尝试构建一个具有多个级别的简单菜单树

RootFolder
- First Sub Folder
-- First Sub Sub Folder
--- First Sub Sub Sub Folder
--- First Sub Sub Sub Sub Folder
- Second Sub Folder
- Second Sub Sub Folder

我的XML非常简单(不是正确的值)

<OrgFolderDetails>
    <FolderName>Main Folder</FolderName>
    <TheChildren>
        <OrgFolderDetails>
            <FolderName>First Sub Folder</FolderName>
            <TheChildren>
                <OrgFolderDetails>
                    <FolderName>First Sub Sub Folder</FolderName>
                    <TheChildren>
                        <OrgFolderDetails>
                            <FolderName>First Sub Siub Sub Folder</FolderName>
                            <TheChildren>
                                <OrgFolderDetails>
                                    <FolderName>First Sub Sub Sub Sub Folder</FolderName>
                                    <TheChildren/>
                                </OrgFolderDetails>
                            </TheChildren>
                        </OrgFolderDetails>
                    </TheChildren>
                </OrgFolderDetails>
            </TheChildren>
        </OrgFolderDetails>
        <OrgFolderDetails>
            <FolderName>Second Sub Folder</FolderName>
            <TheChildren>
                <OrgFolderDetails>
                    <FolderName>Second Sub Sub Folder</FolderName>
                    <TheChildren/>
                </OrgFolderDetails>
            </TheChildren>
        </OrgFolderDetails>
    </TheChildren>
</OrgFolderDetails>

我使用过jQuery的.filter()和。 find()每个()没有任何成功,它没有给我很好的破折号来指示我在哪个级别,它只是吐出文件夹名称。

我遍历的代码

 $(data).find("FolderName").each(function(){
             var folderName = $(this).text();

            $("#folderLevels").append(folderName+"<br/>");
         });

2 个答案:

答案 0 :(得分:1)

好的,所以根据我的理解,我们需要建立一个菜单,其中包含一定数量的前面破折号,具体取决于孩子的等级。 幸运的是,jQuery让这很容易。

$(data).find("FolderName").each(function(){ 
    var levels = $(this).parents("OrgFolderDetails").size();
    var text = $(this).text();
    var html = "";

    for(var j=0; j < levels; j++){
        html += "-";    
    }
    html += " "+text+"</br>"; //add in that space after the dashes, and the <br>

    $("#folderLevels").append(html);
});

希望有所帮助。这里的主要帮助是parents()方法。 http://api.jquery.com/parents

答案 1 :(得分:0)

我想你会想要使用递归函数。

var s = getNestedString($(data), 0);

function getNestedString(d, level) {
    // get the name of current node
    var s = d.children("FolderName").text() + "<br/>";

    // prepend with dashes for inner levels
    for (var i=0 ; i<level ; i++) {
        s = "-" + s;
    }

    // get children and call this function recursively (incrementing level)
    var ch = d.children("TheChildren").children("OrgFolderDetails");
    for (var i=0 ; i < ch.length ; i++) {
        s = s + getNestedString(ch[i], level+1);
    }

    // return string for current and nested nodes
    return s;
}