0

我正在尝试创建一个 HTML 页面,它允许我以与您阅读它们的方式或多或少相同的方式输出 XML 文件中元素的所有节点名称,例如:

<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

这是执行您要完成的任务的一种方法,请确保正确抓取节点。我使用所有 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){

在这里,您只访问具有多个子节点的节点,但您似乎也想访问节点的单个子节点,不是吗?然后,当你真正检索孩子时

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

考虑如果有多个与node;同名的元素会发生什么 每次访问其中一个时,都会遍历具有该名称的第一个节点的子节点。在您的示例中,这不会发生,但是如果您有

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

然后当您尝试访问第二个b元素时,您将检索第一个元素的子b元素。为什么不只是node.childNodes?然后你可以这样做:

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

没有检查有多少孩子node;如果它为零,则childNodes长度为零的序列,您仍然可以正确地迭代它们。

于 2013-08-28T20:20:27.520 回答