xml dom解析
我无法弄清楚如何访问内部嵌套标签之间的数据。当我运行这个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><a href="../data/csr.html#artcl1"> ...more </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>"+" "+"</p>");
// document.write("</div>")
}
</script>
</div>
</body>
</html>
这可能不会显示在浏览器中的全部代码。顺便说一下,你如何在堆栈溢出中转义html标签?
z[i].childNodes[0].nodeValue
...是的。 z[0]
的firstChild
是Text
节点,其节点nodeValue
(或data
)是'12/09/09'
。
x[i].childNodes[0].nodeValue
...不太好。 x[0]
是Element
节点,其中tagName
等于'h2'
。元素没有任何nodeValue
,因此null
。
可以说x[i].firstChild.firstChild.data
从Text
节点进去的数据<h2>
元,假设有总是只有一个。
使用document.write
输出字符串也是有问题的。如果在文本内容中存在诸如<script>
之类的内容,并且您在不转义的情况下将其写入HTML,则会出现跨站点脚本漏洞。
如果您实际需要做的是从XML文档中提取元素内容,那并不容易。没有标准的方法来从简单的XML元素重新序列化节点内容,就像存在带有HTMLElement.innerHTML
的HTML DOM一样。
你可以做的是递归到儿童重新创建XML的Element
和Text
节点为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
来获取它:更简单,更广泛的兼容性。
准确的输出是什么?是否'
eeeeeeeeegg#1
aaaaapple12/09/09'? – 2009-12-10 01:21:48是的。渲染时输出应该是eeeeeeeeeegg和aaaaaple。 – megatr0n 2009-12-10 01:39:29