2009-08-18 4 views
0

나는이 같은 XML 객체가있는 경우 :E4X : 누락 된 날짜를 XMLList에 삽입 하시겠습니까?

<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

그것은 불행하게도 그 쉬운 일이 아니다. Actionscript에는 Timedelta 클래스 (Python과 같은)가 없습니다. 이렇게하면 날짜 사이의 거리를 약간 아프게 할 수 있습니다. 날짜가 항상 같은 달 (예 : 특정 달의 1-31 일) 내에 있음을 보장 할 수 있다면 그렇게 나쁘지 않습니다. 이 달 또는 범위는 달 장벽을 통과하면 10 이하는 또한 처리하지 않습니다이다 날짜 전에 패드 "0"처럼 멋진 물건을하지 않습니다

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 = [email protected](); 
     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; 
    } 
} 
} 
} 

: 그럼 당신은 같은 것을 사용할 수 있습니다. 첫 번째는 수정하기가 쉽기 때문에 그대로 두었습니다. 두 번째는 전혀 쉽지 않습니다 (특히 날짜가 연도 경계를 넘는 경우). 다시 한 번 말씀 드리겠습니다.

0

XML.ignoreWhitespace = true이면 XML은 그 틈을 무시하고 a.children()은 모든 실제 하위 노드의 목록을 제공합니다 ... 거짓 일 경우 다음을 수행 할 수 있습니다. 널 (null) 날짜 확인 ignoreWhitespace이 거짓하기로

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

이 격차를 채우기 위해,이 같은 작업을해야합니다 :

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

죄송합니다. 공백과 같은 틈을 의미하지는 않았습니다 ... < u >이 2009-04-14에서 2009-04-16까지 어떻게 움직이는 지와 같은 날짜 사이의 갭을 의미했습니다. 날짜가있는 노드를 추가하고 싶습니다. 2009-04-15에 0의 가치가 있습니다. 따라서 날짜에는 간격이 없습니다. 알 겠어? –