E4X:在XMLList中插入缺少日期的节点?

时间:2009-08-18 14:00:01

标签: xml actionscript-3 e4x

如果我有这样的XML对象:

    <a>
    <u date="2009-04-10" value="543"/>
    <u date="2009-04-11" value="234"/>
    <u date="2009-04-13" value="321"/>
    <u date="2009-04-14" value="66"/>
    <u date="2009-04-16" value="234"/>

    <t date="2009-04-01" value="43"/>
    <t date="2009-04-02" value="67"/>
    <t date="2009-04-03" value="432"/>
    <t date="2009-04-08" value="123"/>
    <t date="2009-04-09" value="65"/>

    <l date="2009-04-01" value="12"/>
    <l date="2009-04-02" value="76"/>
    <l date="2009-04-03" value="123"/>
    <l date="2009-04-04" value="6543"/>
    <l date="2009-04-05" value="123"/>
    <l date="2009-04-06" value="65"/>
    <l date="2009-04-15" value="234"/>
    <l date="2009-04-16" value="65"/>
</a>

此XML对象中有3个XMLLists。如果您注意到,日期中存在空白。有没有办法将缺少的日期添加到每个XMLList?值为0.

此外,我不想在每个XMLList中的第一个和最后一个节点之前或之后添加任何日期...我只想填写每个节点之间的缺失日期。

我该怎么做?

感谢!!!

2 个答案:

答案 0 :(得分:0)

如果您有XML.ignoreWhitespace = true,那么您的XML将忽略这些间隙,a.children()将为您提供所有真实子节点的列表...如果它是假的,您可以这样做:< / p>

var myList:XMLList = xml.u + xml.t + xml.l;

要填补空日期的空白,请确保ignoreWhitespace为false,这样的事情应该有效:

var myList:XMLList = xml.u + <x date="0" value="0"/> + xml.t + <x date="0" value="0"/> + xml.l;

答案 1 :(得分:0)

不幸的是,这并不容易。在Actionscript中没有timedelta类(如Python)。这使得找到日期之间的距离有点痛苦。如果您能保证日期始终在同一个月内(例如在给定月份内为1-31),这并不算太糟糕。然后你可以使用类似的东西:

package
{
import flash.display.Sprite;

public class TestXML extends Sprite
{
public function TestXML()
{
    var xml:XML = 
    <a>
        <u date="2009-04-10" value="543"/>
        <u date="2009-04-11" value="234"/>
        <u date="2009-04-13" value="321"/>
        <u date="2009-04-14" value="66"/>
        <u date="2009-04-16" value="234"/>

        <t date="2009-04-01" value="43"/>
        <t date="2009-04-02" value="67"/>
        <t date="2009-04-03" value="432"/>
        <t date="2009-04-08" value="123"/>
        <t date="2009-04-09" value="65"/>

        <l date="2009-04-01" value="12"/>
        <l date="2009-04-02" value="76"/>
        <l date="2009-04-03" value="123"/>
        <l date="2009-04-04" value="6543"/>
        <l date="2009-04-05" value="123"/>
        <l date="2009-04-06" value="65"/>
        <l date="2009-04-15" value="234"/>
        <l date="2009-04-16" value="65"/>
    </a>; // / // <-- need this for stack overflow parse bug :(

    fillBlanks(xml, xml..u);
    fillBlanks(xml, xml..t);
    fillBlanks(xml, xml..l);
}

private function fillBlanks(rootNode:XML, list:XMLList):void
{   
    var dateString:String;
    var matches:Array;
    var currentDate:Date;
    var lastDate:Date;
    for each(var node:XML in list)
    {
        dateString = node.@date.toString();
        matches = dateString.match(/(\d+)\-(\d+)\-(\d+)/);
        currentDate = new Date(matches[1], matches[2], matches[3]);

        while(lastDate && (currentDate.date - lastDate.date) != 1)
        {
            rootNode.insertChildBefore(node, new XML(
                "<" + node.name() + " date=\"" + 
                lastDate.fullYear + 
                "-" + 
                lastDate.month + 
                "-" + 
                (lastDate.date + 1) + 
                "\" value=\"0\" />"));

            lastDate = new Date(lastDate.fullYear, lastDate.month, lastDate.date + 1);
        }

        lastDate = currentDate;
    }
}
}
}

在月份或日期小于10之前,这不会像填充“0”这样花哨的东西。如果你的范围越过月障碍,它也不会处理。第一个很容易修复,所以我留给你。第二个不是很容易(特别是如果日期跨越年份边界),我将再次留给你。