E4X : 누락 된 날짜에 xmllist에 노드 삽입?
-
18-09-2019 - |
문제
다음과 같은 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의 첫 번째 및 마지막 노드 전후에 날짜를 추가하고 싶지 않습니다. 각 노드 사이의 누락 된 날짜를 채우고 싶습니다.
어떻게 할 수 있습니까?
감사!!!
해결책
불행히도 그렇게 쉽지 않습니다. 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;
}
}
}
}
이것은 몇 달 전에 Pad "0"또는 10보다 작은 날짜와 같은 멋진 일을하지 않습니다. 첫 번째는 수정하기가 정말 쉽기 때문에 당신에게 맡깁니다. 두 번째는 그리 쉬운 일이 아닙니다 (특히 날짜가 연도를 교차하는 경우에도).
다른 팁
xml.ignorewhitespace = true가있는 경우 XML은 해당 격차를 무시하고 A.Children ()는 모든 실제 어린이 노드 목록을 제공합니다 ... False 인 경우 다음을 수행 할 수 있습니다.
var myList:XMLList = xml.u + xml.t + xml.l;
널 날짜로 간격을 채우려면 무시하는 Whitespace가 거짓인지 확인하십시오. 이와 같은 것이 작동해야합니다.
var myList:XMLList = xml.u + <x date="0" value="0"/> + xml.t + <x date="0" value="0"/> + xml.l;
제휴하지 않습니다 StackOverflow