如果我有这样的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中的第一个和最后一个节点之前或之后添加任何日期...我只想填写每个节点之间的缺失日期。
我该怎么做?
感谢!!!
答案 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”这样花哨的东西。如果你的范围越过月障碍,它也不会处理。第一个很容易修复,所以我留给你。第二个不是很容易(特别是如果日期跨越年份边界),我将再次留给你。