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 つの XMLLists があります。お気づきの場合は、日付にギャップがあります。不足している日付を各 XMLList に追加する方法はありますか? 値が 0 の場合。

また、各 XMLList の最初と最後のノードの前後に日付を追加したくありません...各ノード間の欠落している日付を埋めたいだけです。

どうやってやるの?

ありがとう!!!

4

2 に答える 2

0

XML.ignoreWhitespace=true がある場合、XML はこれらのギャップを無視し、a.children() はすべての実際の子ノードのリストを提供します...それが false の場合、これを行うことができます:

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

null 日付でギャップを埋めるには、ignoreWhitespace が false であることを確認してください。次のようなものが機能するはずです。

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 には (Python のような) timedelta クラスはありません。これにより、日付間の距離を見つけるのが少し面倒になります。日付が常に同じ月内にあることを保証できれば、それほど悪くはありません (たとえば、特定の月の 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" を埋め込むなどの派手なことは行いません。また、範囲が月の境界を超える場合も処理しません。1つ目は簡単に直せるのでお任せします。2 つ目はまったく簡単ではありません (特に、日付が年の境界をまたいでいる場合)。これもお任せします。

于 2009-08-19T00:08:46.490 に答える