jQuery错误地输出重复的XML子节点

时间:2014-02-10 14:56:28

标签: jquery xml xml-parsing

我正在使用jQuery来解析和输出XML。我有一个嵌套循环来输出TASKS的所有子项,但是每次迭代都会立即输出所有子项,而不是每行输出一个子项。

<xml version="1.0">
<choices>
    <choice id="1" name="Type 1">
        <description>
            Example a
        </description>
        <tasks>
            <task>Do this</task>
            <task>Do that</task>
        </tasks>
    </choice>
    <choice id="2" name="Type 2">
        <description>
            Example b
        </description>
        <tasks>
            <task>Do other</task>
            <task>Do something</task>
        </tasks>
    </choice>
</choices>

我的剧本:

$(function(){
        "use strict";
//Above XML content is being passed as a string for this example
        var str = "<xml version='1.0'><choices><choice id=\"1\" name=\"Type 1\"><description>Example a</description><tasks><task>Do this</task><task>Do that</task></tasks></choice><choice id=\"2\" name=\"Type 2\"><description>Example b</description><tasks><task>Do other</task><task>Do something</task></tasks></choice></choices></xml>";
        var xmlDoc = $.parseXML(str);
        var $xml = $(xmlDoc);

        var temp = {};

        $xml.find('choice').each(function() {
            var $this = $(this);
            temp.id = $this.attr('id');
            temp.title = $this.attr('name');
            temp.description = $this.find('description').text();
            temp.choices = [];

            var counter = 0;

            $this.find('tasks').eq( counter ).each(function(index, child) {

                document.write( $(child).find("task").text() + counter + "<br>");
                counter++;
            });


        });

    });

我希望为任务的孩子看到的输出:

Do this0
Do that1
Do other2
Do something3

我目前看到的输出:

Do thisDo that0
Do otherDo something0

1 个答案:

答案 0 :(得分:0)

如果你需要做的就是打印任务,这可以简化为:

$xml.find('task').each(function (i) {
    document.write($(this).text() + i + "<br>");
});

JSFiddle


如果您需要choice循环来执行此问题之外的其他操作,则可以将任务循环更改为:

        $this.find('task').each(function() {

            document.write( $(this).text() + counter + "<br>");
            counter++;
        });

并将counter声明移到choice循环

之上

JSFiddle
(在jsfiddle中检查控制台,在实际代码中将console.log更改回document.write

以上内容会遍历当前task代码中的所有choice代码。

如果您只是想看看tasks的孩子而不管标签。你可以这样做:

$this.find('tasks').children().each(function() { ...

如果您想确保只找到task的{​​{1}}个孩子,您可以这样做:

tasks

上述所有3个与您当前的xml具有相同的结果(这是您的预期结果)。


问题您在$this.find('tasks').children("task").each(function() { 循环中找到“任务”而不是每个“任务”,并从其中的所有each()标记中获取文本。相反,循环执行每个单独的任务。

进一步细分原始代码的作用......

task