2009-12-10 148 views
2

我无法弄清楚如何访问内部嵌套标签之间的数据。当我运行这个JavaScript,我看到的只是“空”。xml dom解析

这里是我的一个名为 “bboard.xml” xml文件看起来像:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Designed by Someone --> 
<bulletinboard> 
<article> 
<title lang="en"><h2>eeeeeeeeegg #1</h2></title> 
<detail><span class="detail">aaaaapple</span>&lt;a href="../data/csr.html#artcl1"> ...more &lt;/a></detail> 
<date>12/09/09</date> 
</article> 
</bulletinboard> 

这里被命名为 “loadxmldoc.js” 的JavaScript:

function loadXMLDoc(dname) 
{ 
try //Internet Explorer 
    { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    } 
catch(e) 
    { 
    try //Firefox, Mozilla, Opera, etc. 
    { 
    xmlDoc=document.implementation.createDocument("","",null); 
    } 
    catch(e) {alert(e.message)} 
    } 
try 
    { 
    xmlDoc.async=false; 
    xmlDoc.load(dname); 
    return(xmlDoc); 
    } 
catch(e) {alert(e.message)} 
return(null); 
} 

最后,这里是我想要显示javascript结果的实际HTML页面。 它被称为“javdemo.html”:

<html> 
<head> 
<script type="text/javascript" src="loadxmldoc.js"> 
</script> 
</head> 

<body> 


<div> 
<script type="text/javascript"> 
xmlDoc=loadXMLDoc("bboard.xml"); 

var x=xmlDoc.getElementsByTagName("title"); 
var y=xmlDoc.getElementsByTagName("detail"); 
var z=xmlDoc.getElementsByTagName("date"); 

document.write("<h4>"+"A Live Bulletin Board"+"</h4>"); 
     for (i=0;i<x.length;i++) 
    { 

    document.write("<h1>"+x[i].childNodes[0].nodeValue+"</h1>"); 
    document.write(y[i].childNodes[0].nodeValue); 
    document.write(z[i].childNodes[0].nodeValue); 
    document.write("<p>"+"&nbsp;"+"</p>"); 
    // document.write("</div>") 
    } 
</script> 
</div> 
</body> 
</html> 

这可能不会显示在浏览器中的全部代码。顺便说一下,你如何在堆栈溢出中转义html标签?

+0

准确的输出是什么?是否'

eeeeeeeeegg#1

aaaaapple12/09/09'? – 2009-12-10 01:21:48

+0

是的。渲染时输出应该是eeeeeeeeeegg和aaaaaple。 – megatr0n 2009-12-10 01:39:29

回答

2
z[i].childNodes[0].nodeValue 

...是的。 z[0]firstChildText节点,其节点nodeValue(或data)是'12/09/09'

x[i].childNodes[0].nodeValue 

...不太好。 x[0]Element节点,其中tagName等于'h2'。元素没有任何nodeValue,因此null

可以说x[i].firstChild.firstChild.dataText节点进去的数据<h2>元,假设有总是只有一个。

使用document.write输出字符串也是有问题的。如果在文本内容中存在诸如&lt;script>之类的内容,并且您在不转义的情况下将其写入HTML,则会出现跨站点脚本漏洞。

如果您实际需要做的是从XML文档中提取元素内容,那并不容易。没有标准的方法来从简单的XML元素重新序列化节点内容,就像存在带有HTMLElement.innerHTML的HTML DOM一样。

你可以做的是递归到儿童重新创建XML的ElementText节点为HTML的。该document.importNode方法应该能够做到这一点,但它不能在IE浏览器,所以你必须做你自己:

<div id="board"></div> 
<script type="text/javascript"> 
    var xdoc= loadXMLDoc('board.xml'); 
    var titles= xmlDoc.getElementsByTagName('title'); 
    var details= xmlDoc.getElementsByTagName('detail'); 
    var dates= xmlDoc.getElementsByTagName('date'); 

    var board= document.getElementById('board'); 
    for (var i= 0; i<titles.length; i++) { 
     appendImportedInner(board, titles[i]); 
     appendImportedInner(board, details[i]); 
     board.appendChild(appendImportedInner(document.createElement('p'), dates[i])); 
    } 

    // Import Text and Element nodes inside a parent XML node to a target HTML node 
    // Currently ignores any other type of node, such as comments 
    // 
    function appendImportedInner(dest, parent) { 
     for (var i= 0; i<parent.childNodes.length; i++) { 
      var child= parent.childNodes[i]; 
      if (child.nodeType==3) { // TEXT_NODE 
       dest.appendChild(document.createTextNode(child.data)); 
      } 
      if (child.nodeType==1) { // ELEMENT_NODE 
       dest.appendChild(document.createElement(child.tagName)); 
       for (var ai= 0; ai<child.attributes.length; ai++) { 
        var attr= child.attributes[ai]; 
        dest.lastChild.setAttribute(attr.name, attr.value); 
       } 
       appendImportedInner(dest.lastChild, child); 
      } 
     } 
     return dest; 
    } 
</script> 

与DOM方法做它可以让你忘记讨厌document.write并设置内容随时在加载过程中进行,这也意味着您可以使用回调加载异步的XML文档来填充板,而不是暂时使用的浏览器暂停同步加载程序。

无论如何,您当前的loadXMLDoc()中使用的Document.load不是标准的XML DOM方法,并且不适用于WebKit(Chrome,Safari,...)。要从服务器加载XML文件,最好使用正常的XMLHttpRequest来获取它:更简单,更广泛的兼容性。

+0

我试过你的代码,现在在IE中得到一个完全空白的页面。同样的事情在Firefox也是如此。基本上我想显示来自xml的超链接链接,我想不出任何其他方式来做到这一点,正如你所说的从xml序列化它。 – megatr0n 2009-12-10 02:11:33

+0

适用于我(仅包含'loadxmldoc'后面的代码块)。 – bobince 2009-12-10 02:46:00

+0

谢谢。它现在有效。刚将“board.xml”更正为“bboard.xml”。 – megatr0n 2009-12-10 03:03:49