如果有人可以为此提供解释,我会 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中重建整个应用程序。我没有那个选择。如果有人能解释这个谜,请你做!提前谢谢!
答案 0 :(得分:0)
我真的不明白原始问题到底是什么,因为你没有发布你的非工作代码,只有你的代码不是非常好但是非常有效。我所看到的只是一个不是最好的方法的问题,无论语言如何。
我建议的是:
node.childNodes[1].childNodes[nextNode].nodeName;
的表达式