-1

誰かがこれについて説明できるなら、私はそれを見てみたいです! 元の XML の一部である合計 70 の質問とは対照的に、XML データ ソースから 20 のランダムな質問を表示するには、レガシー アプリケーションを追加する必要がありました。大したことではありませんよね?違う!最終的には問題なく動作しましたが、これは完全な HACK です。何らかの理由で、動的に生成された XML ドキュメントに追加しているノードの一部が「未定義」として返されます。「do while」ループの条件として適切な数の XMLNode を使用して、反復を「for」ループから「do while」ループに変更するまで、16 から 20 の質問をレンダリングし続けました。誰でも説明できますか?以下は、読者のためのいくつかのメモを含むコードです。

関数 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 で再構築したでしょう。私にはその選択肢がありませんでした。誰かがこのミステリーを説明できるなら、お願いします!前もって感謝します!

4

1 に答える 1

0

元の問題が何であるかを正確に理解していません。動作していないコードを投稿したのではなく、それほど優れていないが動作しているコードだけを投稿したからです。私が見ているのは、言語に関係なく、最善のアプローチではないという単純な問題です。

私が提案するのはこれです:

  1. なんらかの理由で、元の XML の 70 の質問を保持する必要がある場合は、toString() を呼び出してコピーを作成し、XML にキャストし直します。これにより、存在する可能性のあるオブジェクトの依存関係が解消されます (ただし、AS2 XML が実際のオブジェクトのように機能するかどうかはわかりません)。
  2. ループごとに、新しい XML に追加したノードを削除します。そうすれば、すでに使用しているかどうかを確認するために内部ループを実行する必要がなくなります (これは非常に非効率的です)。
  3. 削除しているので、新しいノードを作成するのではなく、単に新しい XML に移動してみませんか? そうすれば、次のようないくつかの式の代わりに、Florian が提案したヘルパー変数を使用する必要がなくなります。node.childNodes[1].childNodes[nextNode].nodeName;
  4. この時点で、ループを 20 回実行するか、ループを継続するかは問題ではありません。どちらも、20 のランダムな質問で 20 のループになります。
于 2012-06-23T03:12:45.940 に答える