0

如果我有这样的 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 个 XMLList。如果您注意到,日期之间会有间隙。有没有办法将缺失的日期添加到每个 XMLList 中?值为 0。

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

我怎样才能做到这一点?

谢谢!!!

4

2 回答 2

0

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

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

要使用空日期填补空白,请确保 ignoreWhitespace 为假,这样的事情应该可以工作:

var myList:XMLList = xml.u + <x date="0" value="0"/> + xml.t + <x date="0" value="0"/> + xml.l;
于 2009-08-18T18:52:24.210 回答
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”。如果您的范围跨越月份障碍,它也将无法处理。第一个很容易修复,所以我把它留给你。第二个根本不是很容易(特别是如果日期也跨越年份),我再次将它留给你。

于 2009-08-19T00:08:46.490 回答