附加到XMLNode的XMLNodes是“未定义的”? Actionscript 2.0是不友好的

时间:2012-06-21 14:51:13

标签: actionscript xmlnode

如果有人可以为此提供解释,我会 LOVE 看到它!我被要求附加一个遗留应用程序来显示来自XML数据源的20个随机问题,而不是原始XML中共有70个问题。没什么大不了的吧?错误!我最终让它工作得很好,但这完全是黑客!出于某种原因,我附加到动态生成的XML文档的一些节点将作为“未定义”返回。我一直在渲染16到20个问题,直到我将迭代从'for'循环修改为'do while'循环,并使用适当数量的XMLNodes作为'do while'循环的条件。任何人都可以提供解释吗?下面是代码,为读者提供了一些注意事项:

function editXML(xml:XML):XML  {

var node:XMLNode = xml.firstChild;
var newNode:XMLNode = new XMLNode();
var nodeArray:Array = new Array();
var usedNodes:Array = new Array();
var totalNodes:Number = node.lastChild.childNodes.length - 1; 
var nextNode:Number;
var returnNode:XMLNode = new XMLNode();
var tempNode:XMLNode;
var buildNode:XMLNode;
var addNode:Boolean = true;

var tempXML:XML = new XML();
var pagesNode:XMLNode = tempXML.createElement("pages");
tempXML.appendChild(pagesNode);
tempXML.appendChild(node.childNodes[0]);
tempXML.appendChild(node.childNodes[1]);
tempXML.appendChild(node.childNodes[2]);
var questionsNode:XMLNode = tempXML.createElement("pages");
tempXML.firstChild.appendChild(questionsNode);
do
{


    nextNode = Math.floor(Math.random()*totalNodes); 
             **//random number to represent random node**
    //trace(nextNode + " nextNode");
    **//check usedNodes Array to look for node.childNodes[nextNode]. If it already exists, skip and reloop.**
    trace(node.childNodes[1].childNodes[nextNode] + " : pre building Node " + totalNodes);
    if(usedNodes.length == 0)
    {
        buildNode = new XMLNode();
        buildNode.nodeName = node.childNodes[1].childNodes[nextNode].nodeName;
                                       buildNode.nodeValue = node.childNodes[1].childNodes[nextNode].nodeValue;
        tempXML.firstChild.lastChild.appendChild(node.childNodes[1].childNodes[nextNode])
        usedNodes.push(node.childNodes[1].childNodes[nextNode]);
        nodeArray.push(node.childNodes[1].childNodes[nextNode]);
        trace("adding first node : " + nodeArray.length); 
        addNode = false;
    }
    else
    {
       for(var j:Number = 0; j < usedNodes.length; j++)
       {
           if(usedNodes[j] == node.childNodes[1].childNodes[nextNode])
           {                
               addNode = false;
               trace("skipping node : " + nodeArray.length);
           }
       }
    }
    **//if node not in usedNodes, add node to XML**
    if(addNode)
    {           


        trace(node.childNodes[1].childNodes[nextNode] + " : building Node"); **//This trace statement produced a valid node**
        tempXML.firstChild.lastChild.appendChild(node.childNodes[1].childNodes[nextNode]);
      **//Before modifying the code from adding nodes to the xml from an Array called 'nodeArray' in a for loop to adding nodes directly to the xml in a do while loop with the length of the xml node used to retrieve data for the questions as the condition, I was not always getting 20 questions. Some of the nodes were being rendered as 'undefined' and not appended to the xml, even though they were traced and proven valid before the attemp to append them to the xml was made**
        usedNodes.push(node.childNodes[1].childNodes[nextNode]);            
  }

    addNode = true;
}
while(tempXML.firstChild.lastChild.childNodes.length <= 19);
trace(tempXML.firstChild.lastChild.childNodes.length + " final nodes Length");

courseXML = tempXML;
//removes the old question list of 70 and replaces it with the new question list of 20. Question list is the last node.


return tempXML;

}

如果我有我的选择,我会用Flex3在Flex中重建整个应用程序。我没有那个选择。如果有人能解释这个谜,请你做!提前谢谢!

1 个答案:

答案 0 :(得分:0)

我真的不明白原始问题到底是什么,因为你没有发布你的非工作代码,只有你的代码不是非常好但是非常有效。我所看到的只是一个不是最好的方法的问题,无论语言如何。

我建议的是:

  1. 如果由于某种原因你需要保留原来的70个XML问题,可以通过调用toString()然后再转换回XML来制作副本。这将破坏可能存在的任何对象依赖性(虽然我不知道AS2 XML是否像真实对象一样)。
  2. 在每个循环上,删除您添加到新XML的节点。这样你就不必做那个内循环来检查你是否已经使用过它(效率非常低)。
  3. 由于您要删除它,为什么不将它移动到新的XML而不是创建新节点?这样你就不需要使用Florian建议的辅助变量而不是几个看起来像node.childNodes[1].childNodes[nextNode].nodeName;的表达式
  4. 此时,你只需要循环20次,或者你可以在循环时保持......这没关系。两者都会产生20个循环,其中包含20个随机问题。