??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.文档对象模型QDOMQ?
5. parseError对象 6.文g错误 7.XML错误 8. parseError属? 9.遍历节点? 10.为XML文g提供HTML格式 11.通过名称讉KXML元素 12.装蝲UXML文本q入parser 13.装蝲XMLq入Parser 遍历XML节点树:
Q、DOM树?
<book> <book> <book> </booklist></xml>
Q、DOM解析时的错误
DOM是HTML和XML文档的编E基Q它定义了处理执行文档的途径。编E者可以用DOM增加文档、定位文档结构、填加修改删除文档元素。W3C 的重要目标是把利用DOM提供一个用于多个q_的编E接口。W3C DOM被设计成适合多个q_Q可使用L~程语言实现的方法?
2.节点接口
XML parser用来装蝲XML文档到缓存中Q文档装载时Q可以用DOMq行索和处理。DOM采用树Şl构表示XML文档Q文档元素是树的最高阶层,该元素有一个或多个孩子节点用来表示树的分枝?
节点接口E序通常用来d写XML节点树中的个别元素,文档元素的孩子节点属性可以用来构造个别元素节炏VXML parser用来证明Web中的DOM支持遍历节点树的所有函敎ͼq可通过它们讉K节点和及其属性、插入删除节炏V{换节Ҏ到XML中?
所有Microsoft XML parser函数得到W3C XML DOM的正式推荐,除了load?loadXML函数Q正式的DOM不包括标准函数loading XML文档Q。有13个节点类型被Microsoft XML parser支持Q下面列出常用节点:
节点cd例子
Document type <!DOCTYPE food SYSTEM "food.dtd">
Processing instruction <?xml version="1.0"?>
Element <drink type="beer">Carlsberg</drink>
Attribute type="beer"
Text Carlsberg
3.使用XML parser
Z更加熟练的处理XML文档Q必M用XML parser。Microsoft XML parser是IIS5.0所带的一个COMlgQ一旦安装了IIS5.0Qparser可以利用HTML文档和ASP文g中的脚本?
Microsoft XMLDOM parser支持以下~程模式Q?
----支持JavaScript, VBScript, Perl, VB, Java, C++ {等
----支持W3C XML 1.0 和XML DOM
----支持DTD 和validation
如果使用IE5.0中的JavaScriptQ可以用下面的XML文档对象Q?
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
如果使用VBScriptQ可以用下面的XML文档对象Q?
set xmlDoc = CreateObject("Microsoft.XMLDOM")
如果使用ASPQ可以用下面的XML文档对象Q?
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
4.装蝲一个XML文g到parser?
下面的代码装载存在的XML文档q入XML parser:
<script language="JavaScript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
// ....... processing the document goes here
</script>
W一行脚本增加了一个Microsoft XML parser实例Q第三行装蝲名ؓ”note.xml”的XML文档q入parser中。第二行保证文档装蝲完成以后parserq行下一步工作?
打开XMl文档ӞXML Parser产生错误代码Qƈ存在parseError对象中,包括错误代码、错误文本和错误行号Q等信息?
下面的例子将试图装蝲一个不存在的文Ӟ然后产生相应的错误代码:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("ksdjf.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
下面使用不正的格式装蝲XMl文档Q?
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
属性描qͼ
errorCode q回长整型错误代?
reason q回字符串型错误原因
line q回长整型错误行?
linePos q回长整型错误行号位|?
srcText q回字符串型产生错误原因
url q回url装蝲文档指针
filePos q回长整型错误文件位|?
一U通用的析取XML文档的方法是遍历节点树和它的元素倹{下面是使用VBScript写的遍历节点树的E序代码Q?
set xmlDoc=CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
for each x in xmlDoc.documentElement.childNodes
document.write(x.nodename)
document.write(": ")
document.write(x.text)
next
XML的一个优Ҏ把HTML文档和它的数据分d。通过使用览器中的XML parserQHTML面可以被构造成静态文档,通过JavaScript提供动态数据。下面的例子使用JavaScriptdXML文档Q写XML数据成HTML元素Q?
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
nodes = xmlDoc.documentElement.childNodes
to.innerText = nodes.item(0).text
from .innerText = nodes.item(1).text
header.innerText = nodes.item(2).text
body.innerText = nodes.item(3).text
下面的例子用JavaScriptdXML文档Q写XML数据成HTML元素Q?
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
document.write(xmlDoc.getElementsByTagName("from").item(0).text)
下面的代码装载文本字W串q入XML parser Q?
<script language="JavaScript">
var text="<note>"
text=text+"<to>Tove</to><from>Jani</from>"
text=text+"<heading>Reminder</heading>"
text=text+"<body>Don't forget me this weekend!</body>"
text=text+"</note>"
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(text)
// ....... processing the document goes here
</script>
<html>
<body>
<script language="javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
document.write("The first XML element in the file contains: ")
document.write(xmlDoc.documentElement.childNodes.item(0).text)
</script>
</body>
</html>
<html>
<body>
<script language="VBScript">
txt="<h1>Traversing the node tree</h1>"
document.write(txt)
set xmlDoc=CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
for each x in xmlDoc.documentElement.childNodes
document.write("<b>" & x.nodename & "</b>")
document.write(": ")
document.write(x.text)
document.write("<br>")
next
</script>
</body>
</html>
装蝲XML q入HTML
<html>
<head>
<script language="JavaScript"
for="window" event="onload">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
nodes = xmlDoc.documentElement.childNodes
to.innerText = nodes.item(0).text
from.innerText = nodes.item(1).text
header.innerText = nodes.item(2).text
body.innerText = nodes.item(3).text
</script>
<title>HTML using XML data</title>
</head>
<body bgcolor="yellow">
<h1>Refsnes Data Internal Note</h1>
<b>To: </b><span id="to"></span>
<br>
<b>From: </b><span id="from"></span>
<hr>
<b><span id="header"></span></b>
<hr>
<span id="body"></span>
</body>
</html>
所有类型的XML解析器都要求处理对象是“格式良好”的XML文档Q有些还能根据DTD或XML Schemaq行有效性验证,DOM QDocument Object ModelQ解析器XML文档一ơ性解析,生成一个位于内存中的对象树用以描述该文档。 ?
DOM是一U与q_和语a无关的接口,它允许程序和脚本动态访问和修改文档的内宏V结构和cd。它定义了一pd的对象和Ҏ对DOM树的节点q行各种随机操作Q?
?Document对象Q作为树的最高节点,Document对象是对整个文档q行操作的入口。?
?Element和Attr对象Q这些节点对象都是文档某一部分的映,节点的定U层ơ恰好反映了文档的结构。?
?Text对象Q作为Element和Attr对象的子节点QText对象表达了元素或属性的文本内容。Text节点不再包含M子节炏V?
?集合索引QDOM提供了几U集合烦引方式,可以对节Ҏ指定方式q行遍历。烦引参数都是从0开始记数的?/p>
DOM树中的所有节炚w是从Node对象l承而来的。Node对象定义了一些最基本的属性和ҎQ利用这些方法可以实现对树的遍历Q同ӞҎ属性还可以得知节点的名U、取值ƈ判断其类型。?
利用DOMQ开发h员可以动态地创徏XML、遍历文档、增?删除/修改文档内容。DOM提供的API与编E语a无关Q所以对一些DOM标准中没有明定义的接口Q不同解析器的实现方法也可能有所差别。ؓ方便描述Q本文的举例均采用MSXML DOMҎq用VB Script~写代码。?
Q、DOM树的l构
Document对象建立之后Q就可以与XML文档或数据岛联系在一赗数据岛的加载方法是数据岛ID赋给Document对象Q?
<XML ID=“dsoDetails?src=“Books.xml?gt;</XML>
Set doc = dsoDetails.XMLDocument
加蝲文档大体上分Z步:
1Q用CreateObjectҎ创徏分析器实例;
2Q设|async属性ؓFalseQ禁止异步加载,q样当文档加载完毕,控制权才会返回给调用q程Q如果想获取文档加蝲状态,可以dreadyState属性|
3Q用loadҎ加蝲指定文档。?
Set doc = CreateObject(“Microsoft.XMLDOM?
doc.async = False
doc.load “Books.xml”?
XML DOMq提供了一UloadXML的方法可以把XML字符串加载到DOM树中Q用时只要把XML字符串直接作Ҏ的参数即可。?
Q、DOM树的讉K
在文档加载完毕之后就可以使用documentElement属性访问根元素Q?
Set rootNode = doc.documentElement
一旦徏立了对DOM树中某个节点Q例如根节点Q的引用Q就可以Ҏ节点间的{关系调用适当的方法进行遍历。?
下面以books.xmlZ说明各种Ҏ的用:
<xml id=“dsoBooks?gt;
<?xml version=?.0?>
<booklist>
<title>The Gourmet Microwave</title>
<price>9.95</price>
<author>Charlotte M. Cooper</author>
<author>Shelley B. Burke</author>
<author>Regina P. Murphy</author>
</book>
<title>Sushi, Anyone?</title>
<price>14.99</price>
</book>
<title>Straight Talk About Computers</title>
<price>19.99</price>
<author>Lars Peterson</author>
</book>
建立对第二个<book>元素的引用:
Set theNode =dsoBooks.XMLDocument.documentElement.childNodes(1)
?根节点:theNode.ownerDocumentq回Document节点Q指向XML文档本nQ?
?兄弟节点QtheNode.previousSiblingq回W??lt;book>元素QtheNode.nextSiblingq回W??lt;book>元素;
?父节点:theNode.parentNodeq回<booklist>元素;
?子节点:theNode.firstChildq回<title>元素QtheNode.lastChildq回< price>元素QtheNode.childNodesq回子节炚w合,包括Sushi下面的所有元素。节点记C0开始,?theNode.childNodes(0)的结果与theNode.firstChild的结果是一L。?
获得节点的引用后Q就可以d节点的相关信息:
?节点cdQtheNode.nodeTypeQ本例ؓ1QDocument对象cd?Q元素类型ؓ1Q属性类型ؓ2Q?
?节点名称QtheNode.nodeNameQ本例ؓbookQ?
?节点|theNode.nodeValueQ本例ؓnullQ对于Attr节点Q返回的是属性|而对于Element节点Q返回的是null。?
在MSXML中,对Node对象q提供了一些额外的Ҏ和属性:
?nodeTypeStringQ用字符串的方式昄节点cdQ如theNode.nodeTypeString的结果是“element”;
?text: 昄当前节点及其所有子节点的文本内?
?xmlQ获取XML文档数据Q通常是从根元素开始的所有内宏V?/p>
Q、XML格式的动态{换?
通过学习XSLQ我们已l能够用样式单对XML文档q行转换。但q种q程是静态的Q即在编写代码时Q已l指定了作用在XML上的XSL文gQ在E序q行q程中不能再做改变。而利用DOMQ我们能够实现XML格式的动态{换,卛_E序q行ӞXSL载入q对XML文档q行转换。?
把XSL载入DOM对象的步骤基本上与XML文档的蝲入过E是一LQXSL本n是XML文档Q:
Set stylesheet = CreateObject(“Microsoft.XMLDOM?
stylesheet.async = False
stylesheet.load “TransformDetails.xsl”?
DOM提供了两个函数进行这U{换,作用对象可以是树中Q何节炏V这样就可以实现对DOM树的L的部分进行格式{换。?
?transformNodeToObjectҎQ该Ҏ需要两个参敎ͼW一个参数指向XSL文gQ第二个参数存放转换后的XML数据的节炏V例如:
Set targetNode = CreateObject(“Microsoft.XMLDOM?
srcNode.transformNodeToObject stylesheet, targetNode
?transformNodeҎQ该Ҏ只需要一个参数指明XSL文g。如下例是将源节点{换ؓ一个字W串变量strQ?
str = srcNode.transformNode(stylesheet)
DOM在解析XML文档的时候可能会产生各式各样的错误,可以ҎParseError对象中的属性得知出错的可能原因及相关信息。?
常用的属性及其含义如下表所C:
属?说明
errorCode 错误代码
filepos 错误在文档中的绝对字W位|?
line 错误所在行的行号?
linepos 错误所在行的字W位|?
reason 错误产生原因
srcText 错误所在行的源代码
url 最q一份含有解析错误的XML文档的URL地址
Q、访问DOM树中的元素与属性?
DOMq提供了许多查找节点的方法。其中基于搜索机制的Ҏ有:
?Ҏ标签名称搜烦元素Q?
?使用XSL模式搜烦节点Q?
?利用集合索引搜烦节点。?
以books.xmlZQDocument对象中的getElementsByTagNameҎ是Ҏ参数中的标签名称在全文范围内查找元素的,q回值是一个NodeList对象Q?
Set doc = dsoDetails.XMLDocument
Set authors = doc.getElementsByTagName(“author?
上述查询l果中包含了文档中出现的全部4位作者。如果调用的是Element对象中的getElementsByTagNameҎQ除了搜索范围羃ؓ该元素的所有后l节点之外,其他的情况都是一L。?
所有类型的节点都带有selectNodesҎQ该Ҏ的唯一参数是XSL的模式规则,q回值是匚w该规则的l果集合。调用这个方法可以利用XSL的模式匹配策略查找节炏V例如:
Set rootNode = doc.documentElement
Set cheapbooks = rootNode.selectNodes(?/book[price < 10]?
q个例子q回所有售价低?0元的<book>元素。另外,节点中的selectSingleNodesҎ的用法与selectNodes是一LQ只是返回结果ؓ查找到的满条g的第一个节点而已?
对于元素节点Q获取元素标{U的Ҏ有两U:anyElement.nodeName和anyElement.tagName。前者是Node对象的属性,后者是Element对象的属性。?
如果惌取元素中的文本内容,? <price>9.95
</price>Ӟ讉KElement对象中的nodeValue属性是错误的,q时q回l果是nullQ而不是预期的9.95。含有文本内容的元素都包含一个Textcd的子节点Q所以只有通过Text对象中的nodeValue属性才能真正访问到文本内容。 ?
d元素的步骤如下:
?创徏一个Text节点q赋|
?创徏Element节点Q?
?把Text节点挂在Element节点下,作ؓ它的子节点;
?把Element节点插入到XML文档的合适位|上。?
对于元素节点的删除和替换操作Q首先都要对操作对象q行定位Q然后相应地执行对象节点所属父节点的removeChildҎ和replaceChildҎ卛_。?
Attr节点的各U操作在原理上与Element节点相同。Attr对象同样l承了Node对象中的各种Ҏ和属性,q且MSXML中还提供了name属性和value属性,能够更直接地讉K到属性信息。另外,q可以通过属性所属元素的相关Ҏ讉K属性,如通过getAttribute?setAttributeҎd属性值或修改属性|或者用getAttributeNodeҎ直接q回Attr对象。?
创徏新属性最直接的办法就是用Element对象中的setAttributeҎ。也可以先用Document对象中的 createAttributeҎ讄属性|然后使用Element对象中的setAttributeNodeҎ把新节点d到DOM树中。同样地Q删除属性最直接的方法是调用Element中的removeAttributeҎ。另外一U方案是先用getAttributeNodeҎҎ作对象进行定位,然后执行removeAttributeNode操作。?
从以上的介绍中可以看出,׃节点间的l承关系Q以及各U类型节Ҏw提供的丰富的接口,用户可以很容易地扑ֈ一套适合自己需要的对象操作Ҏ。?
Q、DOM的显C功q?
DOM技术还可以用来昄XML数据。XSL样式单面向的是XML文档的{换,用于昄格式的{换是其应用的一个方面,所以在昄功能上还存在着一些不I
?不易完成对XML数据的复杂处理,如将英文字母全部转换为大写,截取指定长度的字W串Q忽略一些特定的标点{;
?不易对XML数据中的数D行计;
?一个XSL通常是静态地作用C个XML文档上,无法多个XML文档中的数据用一个XSL合ƈ转换Z个输出结果。?
使用DOMp够很好地解决上述问题
]]>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>test checkbox</title>
<script language="javascript">
function checkall()
{
var objForm = document.ckform;
var objLen = objForm.length;
for (var elcount = 0; elcount < objLen; elcount++)
{
if (objForm.elements[elcount].type == "checkbox")
{
objForm.elements[elcount].checked = true;
}
}
}
function clearall()
{
var objForm = document.ckform;
var objLen = objForm.length;
for (var elcount = 0; elcount < objLen; elcount++)
{
if (objForm.elements[elcount].type == "checkbox")
{
objForm.elements[elcount].checked = false;
}
}
}
function checkop(opvalue){
var objForm = document.ckform;
var objLen = objForm.length;
for (var elcount = 0; elcount < objLen; elcount++)
{
if (objForm.elements[elcount].type == "checkbox")
{
if (objForm.elements[elcount].id.indexOf(opvalue)==0){
objForm.elements[elcount].checked = true;
}
else{
objForm.elements[elcount].checked = false;
}
}
}
}
function checkresult(){
var objForm = document.ckform;
var objLen = objForm.length;
var flag=true;
var checkvalue="";
for (var elcount = 0; elcount < objLen; elcount++)
{
if (objForm.elements[elcount].type == "checkbox")
{
if(objForm.elements[elcount].checked ==true){
flag=false;
if (checkvalue==""){
checkvalue=objForm.elements[elcount].value;
}
else{
checkvalue=checkvalue+","+objForm.elements[elcount].value;
}
}
}
}
if (flag==true){
alert("臛_选择一?);
}
alert(checkvalue);
}
</script>
</head>
<body>
<form name="ckform" method="post" action="">
<table width="100%" border="1">
<tr>
<td><input type="checkbox" id="1011" name="checkbox" value="1"></td>
<td><input type="checkbox" id="1022" name="checkbox" value="2"></td>
<td><input type="checkbox" id="1033" name="checkbox" value="3"></td>
</tr>
<tr>
<td><input type="checkbox" id="2011" name="checkbox" value="4"></td>
<td><input type="checkbox" id="2022" name="checkbox" value="5"></td>
<td><input type="checkbox" id="2033" name="checkbox" value="6"></td>
</tr>
<tr>
<td><input type="checkbox" id="3011" name="checkbox" value="7"></td>
<td><input type="checkbox" id="3022" name="checkbox" value="8"></td>
<td><input type="checkbox" id="3033" name="checkbox" value="9"></td>
</tr>
<tr>
<td><input type="button" name="bu1" id="bu1" value="全? onClick="checkall();"><input type="button" name="bu2" id="bu2" value="全部不? onClick="clearall();"></td>
<td><input type="button" name="Submit" value="选中一? onClick="checkop('20');"></td>
<td><input type="button" name="Submit" value="提交" onClick="checkresult();"></td>
</tr>
</table>
</form>
</body>
</html>