2013-08-30 65 views
0

我想要制作一个基本上有两个滚动框的HTML页面,其中我可以查看树状结构,如文档中的节点名称视图(我有它设置为创建一个按钮而不是纯文本),然后当您在树视图中单击节点名称时,它会在另一个框中显示该节点的值和属性名称。我使用w3schoools建议的标准负载方法​​无法从Javascript中使用getElementsByTagName从XML文档检索节点

function openSourceXML(){ 
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
} else {// code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
; 
xmlhttp.open("GET", 
     "file:///C:/Users/conada/Downloads/FOPwc/dictionary.dic", false); 
xmlhttp.send(); 
xmlDoc = xmlhttp.responseXML; 
}; 

我可以用构造树视图部分没有问题... ...

function start() { 
x = xmlDoc.documentElement; 
document.getElementById("root").innerHTML = xmlDoc.documentElement.nodeName; 
document.write("<br><b><font color=\"rgb(33,0,255)\" size=\"6\">" 
     + x.nodeName + "</b></font>"); 
printChildren(x, 1); 
function printChildren(node, depth) { 
    for (var i = 0; i < node.childNodes.length; ++i) { 
     if (node.childNodes[i].nodeName != "#text") { 
      document.write("<br>"); 
      if (depth == 1) 
       document.write("<b><font color=\"0000FF\" size=\"5\">"); 
      if (depth == 2) 
       document.write("<font color=\"0088DD\" size=\"4\">"); 
      if (depth == 3) 
       document.write("<font color=\"3318BB\" size=\"4\">"); 
      if (depth == 4) 
       document.write("<font color=\"006688\" size=\"4\">"); 
      if (depth == 5) 
       document.write("<font color=\"00DDFF\" size=\"4\">"); 
      for (var j = 0; j < depth; j++) { 
       document 
         .write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp"); 
      } 
      document.write("<button type=\"button\" onClick=\"writeSome(this.value)\" value=\"" + node.childNodes[i].nodeName + "\">" + node.childNodes[i].nodeName +"</button>"); 

      if (depth == 1) 
       document.write("</b></font>"); 
      if (depth == 2) 
       document.write("</font>"); 
      if (depth == 3) 
       document.write("</font>"); 
      if (depth == 4) 
       document.write("</font>"); 

     }; 
     printChildren(node.childNodes[i], depth + 1); 
    }; 
}; 
}; 

当您单击该按钮,它调用一个函数加载文档,将选定节点的名称传递给它。然后,函数尝试使用getElementsByTagName来检索所需的节点,然后事情就会停止。到目前为止,这个函数只是简单地显示你应该得到的节点的名字,然后试图让节点输出名字(这应该在逻辑上匹配)。按钮点击调用的功能是...

function writeSome(value){ 
currNode=value; 
//output passed string to ensure there is no problem there 
document.getElementById("rightPane").innerHTML = currNode + "<br>"; 
//try to grab the node you want 
x = xmlDoc.getElementsByTagName(currNode); 
//display the name of the node to ensure the right node was found (should match name passed in) 
document.getElementById("rightPane").innerHTML += x.nodeName + "<br>"; 
}; 

这些函数都在一个文件中,它是我的html的外部文件。为什么getElementsByTagName似乎什么都不做?如果不是这种方式,我如何才能访问特定的节点?任何帮助都会很棒,因为我已经用尽了我的想法来解决这个问题。

另外,注意,我已经验证了一些函数访问XML文件的工作,比如使用xmlDoc.documentElement来检索根节点,之后的.childNodes遍历整个文件,但这很少使用对我来说,我只想抓住我正在寻找的特定节点,并且快速而干净。

回答

1

我认为你的问题可能是你缺少数组索引。 getElementsByTagName返回一组元素,您需要指定要使用哪一个。

x=xmlDoc.getElementsByTagName(currNode)[0]; 
+0

我我试过这个,但是它没有改变任何东西,它仍然是未定义的 – adam5990

0

你还应该注意的是“的getElementsByTagName”是要回报你的所有节点的数组与标签,而不仅仅是一个单一的节点(除非你只有与该标记一个节点)