0

XML ファイル内の要素のすべてのノード名を、ほぼ同じ方法で出力できるようにする HTML ページを作成しようとしています。たとえば、次のようになります。

<a>
 <b>
  <c></c>
 </b>
 <d>
  <e></e>
 </d>
</a>

出力します:

a
 b
  c
 d
  e

これを実現するために、Javascript 関数を使用して XML ドキュメントを再帰的に走査しています。ただし、私が作成した関数は、最低レベルまで一度だけトラバースして停止し、次のようになります。

a
 b
  c

これは私のJavascript関数です

function printChildren(node){
 if(node.childNodes.length > 1){
  y=xmlDoc.getElementsByTagName(node.nodeName)[0].childNodes;
  for(i=0;i<y.length;i++){
   if(y[i].nodeName!="#text"){
    document.write("<br>--->" + y[i].nodeName);
    alert(y[i].nodeName);
    printChildren(y[i]);
   };
  };
 };
};

私のアプローチが間違っているのか、それとも再帰の最初のレベルが終了した後に関数が壊れているだけなのかはわかりません。ブラウザの癖が原因である場合に備えて、Mozilla Firefox でこれをテストしています。

4

2 に答える 2

2

達成しようとしていることを実行する 1 つの方法を次に示します。ノードを適切に取得していることを確認してください。私はすべての HTML を使用してデモを行いました (JSFIDDLE: http://jsfiddle.net/6WNdZ/ -- フィドルは実行後にのみ表示されるようです):

<hmtl>
    <head>
        <script>
            function printChildren(node, depth) {
                if (!depth) { depth = 1; }
                for(var x = 0; x < node.childNodes.length; ++x) {
                    if (node.childNodes[x].nodeName == '#text') { continue; }
                    var space = '';
                    for(var y = 0; y < depth; ++y) {
                        space += "&nbsp;&nbsp;";
                    }
                    document.write(space + node.childNodes[x].nodeName + "<br />");
                    printChildren(node.childNodes[x], depth + 1);
                }
            }

            window.onload = function() {
                var root = document.getElementById('container');
                printChildren(root);
            }
        </script>
    </head>
    <body>
        <div id='container'>
            <a>
                <b>
                    <c></c>
                </b>
                <d>
                    <e></e> 
                </d>
            </a>
        </div>
    </body>
</html>
于 2013-08-28T20:26:54.447 に答える
1

あなたは自分が思っているように子供たちを手に入れていません。

if(node.childNodes.length > 1){

ここでは、複数の子を持つノードのみにアクセスしていますが、ノードの 1 つの子にもアクセスしたいようですね。次に、実際に子を取得すると

  y=xmlDoc.getElementsByTagName(node.nodeName)[0].childNodes;

と同じ名前の要素が複数ある場合にどうなるかを考えてみましょうnode。それらのいずれかにアクセスするたびに、その名前を持つ最初のノードの子を反復処理します。あなたの例では、これは起こりませんが、

<a>
  <b><c1></c1></b>
  <b><c2></c2></b>
</a>

次に、2 番目の要素にアクセスしようとするbと、最初の要素の子が取得されますb。だけではないのはなぜnode.childNodesですか?次に、次のようにします。

y=node.childNodes;
for(i=0;i<y.length;i++){

子供の数を確認せずnodeに。ゼロの場合childNodes、長さゼロのシーケンスであっても、それらを正しく反復処理します。

于 2013-08-28T20:20:27.520 に答える