用Javascript解析XML并创建数组

Parsing XML with Javascript and create array

本文关键字:创建 数组 XML Javascript 解析      更新时间:2023-09-26

我正在逐步通过一堆XML,试图在javascript中构建一个数组。

XML:

<?xml version="1.0" encoding="utf8" ?>
<session>
    <id>12</id>
    <name>20130520105033-0-1</name>
    <userid>0</userid>
    <changed>2013-05-20 11:16:31</changed>
    <till>1</till>
    <custid>1</custid>
    <details>
        <item>
            <prodcode>TRD3066</prodcode>
            <qty>1</qty>
            <tax>15</tax>
            <uprice>23.1</uprice>
            <price>1</price>
        </item>
        <item>
            <prodcode>DIC72000280</prodcode>
            <qty>1</qty>
            <tax>15</tax>
            <uprice>278.26</uprice>
            <price>1</price></item>
        <item>
            <prodcode>KRE22208</prodcode>
            <qty>1</qty>
            <tax>15</tax>
            <uprice>4.65</uprice>
            <price>1</price>
        </item>
    </details>
    <comment></comment>
    <customer_comment></customer_comment>
</session>

用来解析这个的Javascript:(传递details XML标签后)

function parse(details){
    var ret=[];var tot=[];
    jQuery(details).find("item").each(function(){
        ret[0]= jQuery(this).find('prodcode').text();
        console.log("parse "+ret[0]);
        ret[1]= jQuery(this).find('qty').text();
        ret[2]= jQuery(this).find('tax').text();
        ret[3]= jQuery(this).find('uprice').text();
        ret[4]= jQuery(this).find('price').text();
        tot.push(ret);
        console.log("tot="+tot);
    });
    return tot;
}

问题控制台结果为

解析TRD3066合计= TRD3066, 1, 15日,23.1,1解析DIC72000280合计= DIC72000280 1 15278 .26 1, DIC72000280, 1, 15278 .26, 1解析KRE22208合计= KRE22208 1 15日4.65,1,KRE22208, 1, 15日4.65,1,KRE22208, 1, 15日,

4.65, 1

这是其中一个晚上,我只是不明白为什么结束tot数组不是所有的单独项目??

我认为这是导致问题的.each函数,您应该将其替换为简单的for循环

var items = jQuery(details).find("item");
for (var i = 0; i < items.length; i++) {
    var ret = [];
    ret[0] = jQuery(items[i]).find('prodcode').text();
    console.log("parse " + ret[0]);
    ret[1] = jQuery(items[i]).find('qty').text();
    ret[2] = jQuery(items[i]).find('tax').text();
    ret[3] = jQuery(items[i]).find('uprice').text();
    ret[4] = jQuery(items[i]).find('price').text();
    tot.push(ret);
    console.log("tot=" + tot);
}

将同一个ret数组的引用多次推入tot,然后更改所引用的ret数组。

还需要注意的是,tot.push(ret)并不是将ret中的每一项都推入tot,而是将ret的引用推入tot。当你在下一轮中改变ret的内容时,它看起来就像tot中的每一项都在改变,因为它们都是对同一个数组的引用。

也许你想用

代替tot.push(ret)
tot.push(ret[0], ret[1], ret[2], ret[3], ret[4]);

或者根本不创建ret数组,而是在获得文本时推送单个文本