附加到XMLNode的XMLNodes是;未定义的“;?ActionScript2.0是不友善的

附加到XMLNode的XMLNodes是;未定义的“;?ActionScript2.0是不友善的,actionscript,xmlnode,Actionscript,Xmlnode,如果有人能解释这一点,我很想看看!我需要附加一个遗留应用程序来显示来自XML数据源的20个随机问题,而不是原始XML中总共70个问题。没什么大不了的,对吧?错了!我最终让它工作得很好,但它完全是一个黑客!出于某种原因,我附加到动态生成的XML文档中的一些节点返回为“未定义”。我不断地提出16到20个问题,直到我将迭代从“for”循环修改为“do-while”循环,并使用适当数量的XMLNodes作为“do-while”循环的条件。有人能解释一下吗?以下是代码,并为读者提供一些注释: 函数edit

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

函数editXML(xml:xml):xml {

var节点:XMLNode=xml.firstChild;
var newNode:XMLNode=newxmlnode();
var noderray:Array=new Array();
var usedNodes:Array=new Array();
var totalNodes:Number=node.lastChild.childNodes.length-1;
变量nextNode:编号;
var returnNode:XMLNode=newxmlnode();
var-tempNode:XMLNode;
var-buildNode:XMLNode;
var addNode:Boolean=true;
var tempXML:XML=new XML();
var pagesNode:XMLNode=tempXML.createElement(“页面”);
appendChild(pagesNode);
appendChild(node.childNodes[0]);
appendChild(node.childNodes[1]);
appendChild(node.childNodes[2]);
var questionsNode:XMLNode=tempXML.createElement(“页面”);
tempXML.firstChild.appendChild(问题节点);
做
{
nextNode=Math.floor(Math.random()*totalNodes);
**//表示随机节点的随机数**
//跟踪(nextNode+“nextNode”);
**//检查usedNodes数组以查找node.childNodes[nextNode]。如果它已经存在,请跳过并重新oop**
跟踪(node.childNodes[1].childNodes[nextNode]+“:预构建节点“+totalNodes);
如果(usedNodes.length==0)
{
buildNode=newXMLNode();
buildNode.nodeName=node.childNodes[1]。childNodes[nextNode]。nodeName;
buildNode.nodeValue=node.childNodes[1]。childNodes[nextNode]。nodeValue;
tempXML.firstChild.lastChild.appendChild(节点.childNodes[1].childNodes[nextNode])
usedNodes.push(node.childNodes[1].childNodes[nextNode]);
noderray.push(node.childNodes[1].childNodes[nextNode]);
跟踪(“添加第一个节点:“+noderray.length”);
addNode=false;
}
其他的
{
对于(变量j:Number=0;j虽然(tempXML.firstChild.lastChild.childNodes.length我真的不太明白最初的问题是什么,因为你没有发布你的非工作代码,只有你的代码不是非常好,但工作正常。我看到的只是一个方法的问题,它不是最好的方法,不管语言如何

我的建议是:

  • 如果出于某种原因,您需要保留原来的70个XML问题,请通过调用toString()然后回溯到XML来创建一个副本。这将打破可能存在的任何对象依赖关系(尽管我不知道AS2 XML的行为是否像真实对象)
  • 在每个循环中,删除添加到新XML中的节点,这样就不必执行内部循环来检查是否已经使用了它(这是非常低效的)
  • 既然要删除它,为什么不将其移动到新的XML中,而不是创建一个新节点?这样,您就不需要使用Florian建议的辅助变量,而不需要使用几个类似于
    node.childNodes[1].childNodes[nextNode].nodeName;
  • 在这一点上,你只需要循环20次,或者你可以在循环的同时保持循环…这没关系。这两种情况都会导致20个循环和20个随机问题

  • 我建议使用更多的局部变量和助手方法,而不是仅仅使用一块代码。
    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;