附加到 XMLNode 的 XMLNodes 是“未定义的”? Actionscript 2.0 不友善
Posted
技术标签:
【中文标题】附加到 XMLNode 的 XMLNodes 是“未定义的”? Actionscript 2.0 不友善【英文标题】:XMLNodes being appended to an XMLNode are "undefined"? Actionscript 2.0 is being unkind 【发布时间】:2012-06-21 14:51:12 【问题描述】:如果有人可以对此提供解释,我会LOVE 看到它!我需要附加一个遗留应用程序来显示来自 XML 数据源的 20 个随机问题,而不是作为原始 XML 一部分的总共 70 个问题。没什么大不了的,对吧?错误的!最后我让它工作得很好,但它完全是 HACK!出于某种原因,我附加到动态生成的 XML 文档的一些节点被返回为“未定义”。在我将我的迭代从“for”循环修改为“do while”循环之前,我一直在呈现 16 到 20 个问题,并使用适当数量的 XMLNodes 作为“do while”循环的条件。任何人都可以提供解释吗?下面是代码,给读者一些注意事项:
函数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;
如果我可以选择,我会使用 AS3 在 Flex 中重建整个应用程序。我没有那个选择。如果有人能解释这个谜团,请做!提前谢谢!
【问题讨论】:
我建议使用更多的局部变量和辅助方法,而不是基本上只使用一个代码块。 【参考方案1】:我真的不明白最初的问题是什么,因为您没有发布您的非工作代码,只是您的代码不是非常好,但工作的代码。我所看到的只是一个不是最好的方法的问题,无论语言如何。
我的建议是这样的:
-
如果出于某种原因需要保留原来的 70 个 XML 问题,请调用 toString() 复制一份,然后再转换回 XML。这将破坏任何可能存在的对象依赖关系(尽管我不知道 AS2 XML 是否像真实对象一样)。
在每个循环中,删除您添加到新 XML 中的节点。这样您就不必执行该内部循环来检查您是否已经使用过它(这确实是低效的)。
既然要删除它,为什么不把它移到新的 XML 中而不是创建一个新节点呢?这样你就不需要使用 Florian 建议的辅助变量,而不是几个看起来像
node.childNodes[1].childNodes[nextNode].nodeName;
的表达式
此时,您将只循环 20 次,或者您可以在循环中继续...没关系。任何一个都会导致 20 个循环,其中包含 20 个随机问题。
【讨论】:
以上是关于附加到 XMLNode 的 XMLNodes 是“未定义的”? Actionscript 2.0 不友善的主要内容,如果未能解决你的问题,请参考以下文章
Web 服务返回的 XmlDocument 作为 XmlNode,那么 XPath 不起作用?