NO.1--建立一个XML数据库data.xml
<?xml version="1.0"?>
<records>
<record>
<name>caca</name>
<qq>154222225</qq>
<email>service@supidea.com</email>
</record>
<records>
NO.2--建立对象CreateObject
建立data.xml的对象先
set xmldoc=server.createobjcet("microsoft.xmldom")
xmldoc.load(server.mappath("data.xml")
NO.3--选定节点SelectNode
你想操作哪个Node,必须定位到这个节点是不是,先看看这个data.xml有几个Node??
用一个递归函数搞定:
getnodes(xmldoc)
sub getnodes(node)
dim i
response.write("<br><b>NodeName:</b>"&node.nodename&"<br><b>NodeTypeString:</b>"&node.nodetypestring&"<br><b>NodeValue:</b>"&node.nodevalue&"<br><b>Text:</b>"&node.text&"<br><b>node.childnodes.length:</b>"&node.childnodes.length&"<p>")
if node.childnodes.length<>0 then
for i=0 to node.childnodes.length-1
getnodes(node.childnodes(i))
next
end if
end sub
用这个函数后,可以看到这个data.xml有10个Node
这些Node可以很简单的定位:
xmldoc
xmldoc.childnodes(0)
xmldoc.childnodes(1)
xmldoc.childnodes(1).childnodes(0)
xmldoc.childnodes(1).childnodes(0).childnodes(0)
xmldoc.childnodes(1).childnodes(0).childnodes(0).text
xmldoc.childnodes(1).childnodes(0).childnodes(1)
xmldoc.childnodes(1).childnodes(0).childnodes(1).text
xmldoc.childnodes(1).childnodes(0).childnodes(2)
xmldoc.childnodes(1).childnodes(0).childnodes(2).text
是不是定位很简单呀,还有个方法,比如定位<name>
xmldoc.selectsinglenode("//name")
还有:
xmldoc.getelementsbytagname("name").item(0)
NO.4--给节点赋值(修改节点的值)
学会了定位节点,利用其属性,就可以修改或者赋值了
例如,把<name>的值caca改为wawa
xmldoc.selectsinglenode("//name").text="wawa"
xmldoc.save(server.mappath("data.xml"))
搞定!
NO.5--创建新的节点CreatenewNode
用createelement或者createnode("","","")
例如:在record下新建个<age>,只需要一句就搞定:
xmldoc.selectsinglenode("//record").appendchild(xmldoc.createelement("<age>"))
给<age>赋值
xmldoc.selectsinglenode("//age").text="20"
xmldoc.save(server.mappath("data.xml"))
搞定!
NO.6--删除一个节点DeleteNode
你必须明确你想删除的这个节点的父节点,以及这个节点的特征
例如:删除<qq>节点
xmldoc.selectsinglenode("//record").removechild(xmldoc.selectsinglenode("//qq"))
例如:删除那个<name>=caca的<record>
xmldoc.selectsinglenode("//records").removechild(xmldoc.selectsinglenode("//record[name='caca']))
xmldoc.save(server.mappath("data.xml"))
搞定!
只有能熟练这6条code,用asp控制xml数据库,也就差不多了...
ASP通过XMLDom在服务器端操作XML文件的主要方法和实现
对于小数据量,xml文件在检索更新上于ACCESS有很多优势。
我曾经测试过不用数据库,把网站的会员信息,商品数据信息,交易信息,网站定制信息全部存放在三个xml文件中,运行结果十分正常,感觉上比数据库快多了,不过没有作测试,不能确定。
下面说一下创建,查询,修改等对xml操作的主要方法
'创建DOM对象
set objDom=server.CreateObject("MicroSoft.XMLDom")
'取得xml数据
'方法1 取得xml文件的xml数据
objDom.load("c:\test.xml")
'方法2 取得xml数据串的数据
objDom.loadxml("<people><man name="sd"/></people>")
'创建一个节点对象
Set Newnode=objDom.CreateElement("people")
'给这个节点赴值
Newnode.Text="人"
' 给这个节点添加属性
Set NewAttribute=objDom.CreateNode("attribute","name","")
NewAttribute.Text= "张三"
Newnode.SetAttributeNode NewAttribute
'给这个节点添加子节点
Set NewnodeChild=objDom.CreateElement("address")
Newnode.appendChild NewnodeChild
'保存这个节点对象
objDom.appendChild Newnode
objDom.save("c:\test.xml")
'查找一个节点对象
set objtofind=objdom.documentElement.SelectSingleNode("//people/man")
'取出这个节点对象的 节点名,节点值,某个属性值,和全部的xml
nodename=objtofind.nodename
nodevalue=objtofind.text
objtofind.GetAttributeNode("name").Nodevalue '属性名为name的属性值
'取出一个属性节点对象
set objattrtofind=objdom.documentElement.SelectSingleNode("//people/man"). GetAttributeNode("name")
'取出这个节点的属性名,属性值
nodeattrname=objattrtofind.nodename
nodeattrvalue=objattrtofind.nodevalue
'删除一个节点对象
set objnode=objdom.documentElement.SelectSingleNode("//people/man") '要删除的节点
set objparentnode=objdom.documentElement.SelectSingleNode("//people") '要删除的节点的父节点
objparentnode.removeChild objnode
'取出一个节点的字节点集合
set objnodes=objdom.documentElement.SelectSingleNode("//people/man").ChildNodes
遍历这个集合
方法1
for each element in objnodes
response.write element.nodename 字节点名
response.write element.text 字节点值
next
方法2
domlength=objnodes.length
for i = 0 to domlength-1
response.write objnodes.childnodes(i).nodename 字节点名
response.write objnodes.childnodes(i).text 字节点值
next
'取出一个节点的属性集合
set objnodes=objdom.documentElement.SelectSingleNode("//people/man").GetAttributeNode("name").attributes
遍历这个集合
for each element in objnodes
response.write element.nodename 属性名
response.write element.nodevalue 属性值
next
等能够熟练的运用xmldom对象来操作xml文件了,就可以享
受xmlhttp对象来实现asp下的许多功能了。
re:[转]ASP通过XMLDom在服务器端操作XML文件的主要方法和实现
飞飞,你怎么不介绍一下@的用法,没了这个,很多事不方便。
xml,有人也称之为数据压缩技术,顾名思义,xml是可以充当数据库来用。
所以,我们可以把xml看成是“小型的数据库”。为什么说是小型呢?因为xml本身的功能及应用方便,与数据库还是存在着一定的差别。那我们为什么要使用xml呢?因为,有时候我们的一些应用程序虽然进行数据存取,但是,如果使用数据库的话,显行有些不够灵活,方便。这个时候,我们就应该结合xml来使用。
xml既然可以看成是数据库,那它的第一步工作就当然是创建链接对象了。(以ASP+xml为例)
创建方法同链接数据库一样,用server.createobject为创建。
方法如下:
set xmlDoc= Server.CreateObject("microsoft.xmldom")
xmlDoc.async=false
xmldata=数据源绝对路径
xmlDoc.load xmldata '这里使用load方法进行链接
既于xml的数据格式是比较人性化的,可以由于人为或其它的原因,引起数据格式不合法,这时如果继续使用的话,会引起程序出程,这样,我们往往在创建好链接对象后进行数据格式验证。
方法如下:
if xmlDoc.parseError.errorCode<>0 then
....错误处理
<%
'----------------------------------------------------------------
'程序简介: 完成asp语言对XML文档中指定节点文本的增加、删除、修改、查看
'入口参数: 无
'出口参数: 无
'------------------------------------------------
'函数名字:ConnectXml()
'入口参数: filename 需要连接或打开的xml文件名
'出口参数: 无
'返回值 :ConnectXml=0,XMLMorntekDocument就是一个成功装载XML文档的对象了。
' ConnectXml<>0,则打印错误信息strError
'------------------------------------------------
dim XMLMorntekDocument
function ConnectXml(filename)
dim strSourceFile
strSourceFile = Server.MapPath(filename)
Set XMLMorntekDocument = Server.CreateObject("Microsoft.XMLDOM")
XMLMorntekDocument.async = false
XMLMorntekDocument.load(strSourceFile)
ConnectXml=XMLMorntekDocument.parseerror.errorcode
if XMLMorntekDocument.parseerror.errorcode<>0 then
strError="<h2>error"&XMLMorntekDocument.parseerror.errorcode&"</h2>"
strError=strError&XMLMorntekDocument.parseerror.reason&"<br>"
strError=strError&XMLMorntekDocument.parseerror.url&"<br>"
strError=strError&XMLMorntekDocument.parseerror.line&"<br>"
strError=strError&XMLMorntekDocument.parseerror.filepos&"<br>"
strError=strError&XMLMorntekDocument.parseerror.srcText&"<br>"
response.write strError
end if
end function
'------------------------------------------------
'函数名字:CloseXml()
'入口参数: 无
'出口参数: 无
'------------------------------------------------
function CloseXml(XMLMorntekDocument)
if IsObject(XMLMorntekDocument) then
set XMLMorntekDocument=nothing
end if
end function
'------------------------------------------------
'函数名字:SelectXmlNodeText(elementname)
'入口参数: elementname 元素的名字
'出口参数: 无
'------------------------------------------------
function SelectXmlNodeText(elementname)
elementname="//"&elementname
temp=XMLMorntekDocument.selectSingleNode(elementname).text
selectXmlNodeText= server.htmlencode(temp)
end function
'------------------------------------------------
'函数名字:InsertXmlNodeText(befelementname,elementname,elementtext)
'入口参数: elementname 插入的元素的名字
' befelementname在此元素的名字前面插入元素
' elementtext 插入的元素的文本
'出口参数: 无
'------------------------------------------------
function InsertXmlNodeText(befelementname,elementname,elementtext)
dim befelement,element
set befelement=XMLMorntekDocument.selectSingleNode("//"&befelementname)
set element= XMLMorntekDocument.createelement(elementname)
befelement.insertBefore element,befelement.firstchild
element.text=elementtext
end function
'------------------------------------------------
'函数名字:UpdateXmlNodeText(elementname,newelementtext)
'入口参数: elementname 元素的名字
' newelementtext元素的新文本
'出口参数: 无
'------------------------------------------------
function UpdateXmlNodeText(elementname,newelementtext)
dim element
set element=XMLMorntekDocument.selectSingleNode("//"&elementname)
element.text=newelementtext
end function
'------------------------------------------------
'函数名字:DeleteXmlNodeText(elementname)
'入口参数: elementname 元素的名字
'出口参数: 无
'------------------------------------------------
function DeleteXmlNodeText(elementname)
XMLMorntekDocument.selectSingleNode("//"&elementname).text =""
end function
%>
XML的重要性不想在这里说了:〉
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
'XML与ASP的操作
Dim objXml,xmlPath
xmlPath=Server.MapPath("Config.xml")
'创建XML对象 Create XMLDOC
Set objXml=Server.CreateObject("Microsoft.XmlDoc")
'读取XML文件 Load XML File
objXml.Load(xmlPath)
'不同步 加快速度
objXml.async = false
'如果XML文件文空 则自动加载XML头
If objXML.parseError.ErrorCode 0 Then
objXML.loadXML ""
End If
'设置根节点对象 Set Document element
'Set objRoot=objXml.documentElement 表示获得XML根节点元素
Dim objPhoto
Set objPhoto=objXml.documentElement.SelectSingleNode("photo")
'修改节点间元素
objPhoto.DocumentElement.SelectSingleNode("").text=value
objPhoto.DocumentElement.SelectSingleNode("").NodeValue=value
'保存XML文件
objXml.Save(xmlPath)
'销毁XML
Set objXml=Nothing
%>
<HTML>
<Head>
<META http=equiv="Content-Type" Content="text/html;charset=gb2312">
<STYLE>
body { font-family:宋体; font-size:9pt;}
th { font-family:宋体; font-size:11pt; font-weight:bold;}
</STYLE>
<Script language="vbscript">
Option Explicit
Dim intRecordsPerPage '每个页面显示的记录数
intRecordsPerPage = 6 '每个页面显示的记录数,默认设定为6
' 更新显示页面的函数
Function window_onload()
' 显示设定的记录数
Style.XMLDocument.selectNodes("//xsl:for-each/@select")(1).Value = "./*[position() < " & intRecordsPerPage + 1 & " and position() > 0]"
transform()
setPageCount()
End Function
' 进行XML-XSLT转换,并显示当前记录的一些信息
Function transform()
DisplayArea.innerHTML = Data.transformNode(Style.DocumentElement)
RecordsPerPage.Value = intRecordsPerPage
End Function
' 重新转换XML,并显示一个状态信息
Function redisplay(intPage)
Dim strDisplay
Dim intPageCount
Dim intRecordCount
' 保存状态信息
intPageCount = PageCount.innerHTML
intRecordCount = RecordCount.innerHTML
transform()
' 显示状态信息
PageCount.innerHTML = intPageCount
RecordCount.innerHTML = intRecordCount
CurrentPage.innerHTML = intPage
End Function
' 重新排序和显示
Function Sort(strField)
Dim sortField
Dim sortOrderAttribute
' 得到排序属性值
Set sortField = Style.XMLDocument.selectSingleNode("//xsl:sort/@select")
Set sortOrderAttribute = Style.XMLDocument.selectSingleNode("//xsl:sort/@order")
' 改变排序的方式
If sortField.Value = strField Or sortField.Value = "./*[0]" Then
If sortOrderAttribute.Value = "descending" Then
sortOrderAttribute.Value = "ascending"
Else
sortOrderAttribute.Value = "descending"
End If
Else
sortField.Value = strField
sortOrderAttribute.Value = "ascending"
End If
Set sortField = Nothing
Set sortOrderAttribute = Nothing
redisplay (CurrentPage.innerHTML)
End Function
' 重新设置每页的记录数
Function setRecordsPerPage()
If IsNumeric(RecordsPerPage.Value) Then
intRecordsPerPage = CInt(RecordsPerPage.Value)
window_onload
End If
End Function
' 显示页数信息
Function setPageCount()
Dim intTotalRecords
PageCount.innerHTML = getNumberOfPages(intTotalRecords)
RecordCount.innerHTML = intTotalRecords
CurrentPage.innerHTML = 1
End Function
' 计算总页数和总记录数
Function getNumberOfPages(intTotalRecords)
Dim intPages
intTotalRecords = Data.XMLDocument.selectNodes("/*/*").length
intPages = intTotalRecords / intRecordsPerPage
If InStr(intPages, ".") > 0 Then
intPages = CInt(Left(intPages, InStr(intPages, "."))) + 1
End If
getNumberOfPages = intPages
End Function
' “下一页”的处理
Function nextPage(intPage)
Dim strDisplay
Dim strDateRange
If CInt(CStr(intPage) * intRecordsPerPage) < Data.selectNodes("/*/*").length Then
intPage = CInt(intPage) + 1
Style.XMLDocument.selectNodes("//@OnClick")(1).Value = "previousPage(" & intPage & ")"
Style.XMLDocument.selectNodes("//@OnClick")(2).Value = "nextPage(" & intPage & ")"
Style.XMLDocument.selectNodes("//xsl:for-each/@select")(1).Value = "./*[position() <= " & (CStr(intPage) * intRecordsPerPage) & " and position() > " & (CInt(intPage) - 1) * intRecordsPerPage & "]"
redisplay (intPage)
End If
End Function
' 处理“上一页”
Function previousPage(intPage)
Dim strDisplay
Dim strDateRange
If intPage > 1 Then
intPage = CInt(intPage) - 1
Style.XMLDocument.selectNodes("//@OnClick")(1).Value = "previousPage(" & intPage & ")"
Style.XMLDocument.selectNodes("//@OnClick")(2).Value = "nextPage(" & intPage & ")"
Style.XMLDocument.selectNodes("//xsl:for-each/@select")(1).Value = "./*[position() <= " & (CStr(intPage) * intRecordsPerPage) & " and position() > " & (CInt(intPage) - 1) * intRecordsPerPage & "]"
redisplay (intPage)
End If
End Function
' “第一页”的处理
Function FirstPage()
Style.XMLDocument.selectNodes("//@OnClick")(1).Value = "previousPage(1)"
Style.XMLDocument.selectNodes("//@OnClick")(2).Value = "nextPage(1)"
Style.XMLDocument.selectNodes("//xsl:for-each/@select")(1).Value = "./*[position() < " & intRecordsPerPage + 1 & " and position() > 0]"
transform()
setPageCount()
End Function
' “最末页”的处理
Function LastPage()
Dim intTotalPages
Dim intTotalRecords
intTotalPages = getNumberOfPages(intTotalRecords)
nextPage (intTotalPages - 1)
End Function
</Script>
</Head>
<body>
<p align="center" style="font-weight:bold;font-size:12pt;color:#0000FF;border-bottom:3px double red;padding-bottom:5px">客户关系表</p>
<XML id='Data'>
<客户关系表 xmlns:dt="urn:schemas-microsoft-com:datatypes">
<客户><序号 dt:dt="int">01</序号><姓名>net_lover</姓名><电子邮件>mengxianhui@21cn.com</电子邮件></客户>
<客户><序号 dt:dt="int">02</序号><姓名>孟子E章</姓名><电子邮件>Lily@sina.com</电子邮件></客户>
<客户><序号 dt:dt="int">03</序号><姓名>http://lucky.myrice.com</姓名><电子邮件>John@21cn.com</电子邮件></客户>
<客户><序号 dt:dt="int">04</序号><姓名>http://lucky.myrice.com</姓名><电子邮件>Karry@163.net</电子邮件></客户>
<客户><序号 dt:dt="int">05</序号><姓名>http://colorweb.go.163.com</姓名><电子邮件>vivki@sina.com</电子邮件></客户>
<客户><序号 dt:dt="int">06</序号><姓名>Frank</姓名><电子邮件>net_lover@mengxianhui.com.cn</电子邮件></客户>
<客户><序号 dt:dt="int">07</序号><姓名>Greg</姓名><电子邮件>meng@mengxianhui.com</电子邮件></客户>
<客户><序号 dt:dt="int">08</序号><姓名>Harry</姓名><电子邮件>sunny@xianhui.net</电子邮件></客户>
<客户><序号 dt:dt="int">09</序号><姓名>Ingrid</姓名><电子邮件>cathy@hotmail.com</电子邮件></客户>
<客户><序号 dt:dt="int">10</序号><姓名>Jeff</姓名><电子邮件>your@mxh.com</电子邮件></客户>
<客户><序号 dt:dt="int">11</序号><姓名>Kelly</姓名><电子邮件>Iloveyou@mengxianhui.com</电子邮件></客户>
<客户><序号 dt:dt="int">12</序号><姓名>Larry</姓名><电子邮件>smilling@mengxianhui.com</电子邮件></客户>
<客户><序号 dt:dt="int">13</序号><姓名>Mark</姓名><电子邮件>money@21cn.com</电子邮件></客户>
<客户><序号 dt:dt="int">14</序号><姓名>Nancy</姓名><电子邮件>www@yahoo.com</电子邮件></客户>
<客户><序号 dt:dt="int">15</序号><姓名>Peter</姓名><电子邮件>dotnet@aol.com</电子邮件></客户>
<客户><序号 dt:dt="int">16</序号><姓名>Rachel</姓名><电子邮件>billgates@microsoft.com</电子邮件></客户>
<客户><序号 dt:dt="int">17</序号><姓名>Seth</姓名><电子邮件>flying@yous.net</电子邮件></客户>
<客户><序号 dt:dt="int">18</序号><姓名>Tim</姓名><电子邮件>agooyboy@lovegirl.com</电子邮件></客户>
</客户关系表>
</XML>
<XML id='Style'>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://lucky.myrice.com" version="1.0">
<msxsl:script language="VBScript" implements-prefix="user">
<![CDATA[
Function getName(node)
getName = node.Item(0).nodeName
End Function
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:apply-templates select="/*"/>
</xsl:template>
<xsl:template match="/*">
<table width="100%" border="0" style="font-size:9pt">
<tr>
<td align="left"><b>第 <span id="CurrentPage"></span> 页 总 <span id="PageCount"></span> 页 共有 <span id="RecordCount"></span> 条记录</b></td>
<td align="right"><b>每页记录数:<input onblur="setRecordsPerPage()" id="RecordsPerPage" style="vertical-align:middle;height:15pt;width:30px"/></b></td>
<td align="right">
<span id="Paging">
<input type="button" OnClick="FirstPage()" value="第一页"/>
<input type="button" OnClick="previousPage(1)" value="上一页"/>
<input type="button" OnClick="nextPage(1)" value="下一页"/>
<input type="button" OnClick="LastPage()" value="最末页"/>
</span>
</td>
</tr>
</table>
<Table WIDTH="100%" BORDER="0" cellpadding="0" cellspacing="1" style="font-size:11pt" bgcolor="#0099ff">
<tr bgcolor="#FF6600" style="cursor: hand;padding:5px">
<xsl:for-each select="./*[1]/*">
<td align="center">
<xsl:attribute name="onclick">
Sort('<xsl:value-of select="user:getName(.)"/>')
</xsl:attribute>
<font color="#EEEEEE"><b><u><xsl:value-of select="user:getName(.)"/></u></b></font>
</td>
</xsl:for-each>
</tr>
<xsl:for-each select="./*[position() < 6 and position() > 0]">
<xsl:sort select="./*[1]" order="ascending"/>
<tr bgcolor="#FFCCFF">
<xsl:for-each select="./*">
<td> <xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</Table>
</xsl:template>
</xsl:stylesheet>
</XML>
<div id="DisplayArea"></div>
<table border="0" width="100%" style="font-size:11pt;">
<tr>
<td align="right">资料来源:www.supidea.com</td>
</tr>
</table>
</body>
</HTML>
尽信网不如无网。我从网上找了一堆asp操作xml的文档,没几个能用的。
毛主席他老人家教导我们,自己动手,丰衣足食。看来一点不假。今天我忙活了半天,终于把网上理论与本人实践结合起来,形成了由本人特色的asp操作xml。这个俺已经在用,应该没问题。如果、偶尔、有时不能用,请自己改,千万不要又要整出个大新闻,回头把我批判一番。
'这是aspXml.asp,缺点: On Error Resume Next用的有点傻,不过我还没有更
'好的办法。
<%
sub connectXml(Path)
dim Interface_node_Count 'INTERFACE参数的个数,即xml文件中又多少人的信息
set objDom=server.CreateObject("microsoft.xmldom")
objDom.async=false
objDom.load(path)
On Error Resume Next
set Interface_node=objdom.documentElement.selectSingleNode("//Record").ChildNodes
'循环次数
On Error Resume Next
Interface_node_Count=Interface_node.length
On Error Resume Next
set Interface_node=objdom.documentElement.selectSingleNode("//Record")
for i=1 to Interface_node_Count-1 step 2
%>
<TR style="HEIGHT: 20px;">
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("OutID").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write(Interface_node.ChildNodes(i).selectSingleNode("money").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write(Interface_node.ChildNodes(i).selectSingleNode("Receiver").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("ReceiverID").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("Style").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("Other").text)
%>
</NOBR></TD>
</TR>
<%
i = i+2
if i < Interface_node_Count-1 then
%>
<TR style="HEIGHT: 20px;">
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("OutID").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write(Interface_node.ChildNodes(i).selectSingleNode("money").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write(Interface_node.ChildNodes(i).selectSingleNode("Receiver").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("ReceiverID").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("Style").text)
%>
</NOBR></TD>
<TD align="center"><NOBR>
<%
On Error Resume Next
response.write (Interface_node.ChildNodes(i).selectSingleNode("Other").text)
%>
</NOBR></TD>
</TR>
<%
end if
next
If err.number <> 0 then
%>
<script>alert("数据损坏或非数据文件!!");history.back();</script>
<%
end if
end sub
%>
引用时,只要包含这个文件,然后connectXml 文件名,就行了
如何用ASP操作XML(一) [ 2005-10-15 6:26:22 PM | Author: soul | From: Original ]
有这个想法是为了把这个Blog的最新留言读到我的个人网站上,但是似乎Blog的RSS只有最新文章的description,晕了...看来读留言是不太可能了...当然学习一些新的东西也不是坏事情...呵呵.那么......让我们来看看ASP如何控制XML吧.
由于XML(可扩展标记语言:eXtensible Markup Language)真正的平台无关性,它正在逐渐成为数据传输的主要介质。XML是一种自描述的语言,数据本身就已经包含了元数据,即关于数据本身的信息。例如:"孟子E章1757281793923net_lover1807581793923"这组数据,从字面很难看出它代表什么意思,也不清楚它有几个数据段组成,但是,如果用XML来做如下的描述,我们就可以清楚地看到每个数据段所代表的含义:
<PersonData>
<Person>
<姓名>孟子E章</姓名>
<身高>175</身高>
<体重>72</体重>
<电话>81793923</电话>
</Person>
<Person>
<姓名>net_lover</姓名>
<身高>180</身高>
<体重>75</体重>
<电话>81793923</电话>
</Person>
</PersonData>
从上面的一段XML中,我们不但可以清楚地看到每一个数据代表的是什么意思了,而且还可以知道数据的分割位置。在我们平常的应用中,我们得到的结果可能是数组、集合或记录集的表现形式,我们该如何把它们转换成自描述的XML格式的数据呢?从数据形式上看,XML是简单的纯字符串的文本格式,字符串在传递时是非常简单、快速而且是容易的,数组在通过引用进行传递时有时是很慢的,而且处理起来很麻烦,而集合和记录集都是对象,在处理时会导致计算机性能的下降,并且这些对象都是与特定的平台相关联的,这就要求平台有内建的处理机制来处理对象的操作。XML已经是W3C的标准,是平台无关的,我们的计算机的唯一要求就是能够处理简单的XML字符串,即XML解析器,它能够解析XML字符串,能够通过一种接口很容易地把数据分解成一个个独立的数据段,以便我们能够进行访问。XML解析器都很小,性能也很好,在每种平台上都可以找到。一旦我们接收到XML数据并把它解析成上面的例子的样式后,我们就可以通过XSLT(eXstensible Stylesheet Language Transformations)把他们转换成不同的表现形式。利用XML的数据格式进行数据传输,将会使我们编写应用程序代码的工作更简单轻松,而且具有良好的可伸缩性。
下面,我们就看看如何来转换我们的数据。我们的例子是在Microsoft Windows 2000,IIS5,MSXML3和ADO2.6下编写的,样例数据采用Microsoft SQL Server7.0自带的Northwind示例数据库。之所以采用SQL Server7而不采用支持XML的SQL Server2000,是考虑到通用性的原则,我们的目的是:处理不同类型的数据源得到的记录集,而不仅仅是象SQL Server2000那样的支持XML输出的数据源。使用ADO,是因为它形式多样,可以处理不同类型的数据源;使用XML,是因为它能够快速传输和解析。但本例的处理方法也适合在任何具有Micrsoft XML解析器,ADO2.5或以上版本的Windows,IIS,SQL Server的环境中。
为简单起见,我们仅选择单价小于等于20美圆,库存大于等于20,产品名称小于等于6个字符的产品:
<%
Dim objRecordset
Set objRecordset = Server.createObject("ADODB.Recordset")
objRecordset.open _
"select ProductName, UnitPrice, UnitsInStock " _
& "FROM Products " _
& "where UnitPrice <= 20 " _
& "AND UnitsInStock >= 20 " _
& "AND LEN(ProductName) <= 6 " _
& "ORDER BY ProductName", _
"Provider=SQLOLEDB;" _
& "Data Source=SomeSQLServer;" _
& "Initial Catalog=Northwind;" _
& "User ID=MyUserName;" _
& "Password=MyPassword;"
%>
现在,我们就用3种方式把我们得到的记录集转换成XML格式。
首先,我们可以遍历整个记录集,采用XML DOM(Document Object Model),建立XML节点树:
<%
Dim objXMLDOM, objRootNode, objNode
Set objXMLDOM = Server.createObject("MSXML2.DOMDocument")
Set objRootNode = objXMLDOM.createElement("xml")
objXMLDOM.documentElement = objRootNode
Do While NOT objRecordset.EOF
Set objRowNode = objXMLDOM.createElement("row")
Set objNode = objXMLDOM.createElement("ProductName")
objNode.text = objRecordset.Fields.Item("ProductName").Value
objRowNode.appendChild(objNode)
Set objNode = objXMLDOM.createElement("UnitPrice")
objNode.text = objRecordset.Fields.Item("UnitPrice").Value
objRowNode.appendChild(objNode)
Set objNode = objXMLDOM.createElement("UnitsInStock")
objNode.text = objRecordset.Fields.Item("UnitsInStock").Value
objRowNode.appendChild(objNode)
objRootNode.appendChild(objRowNode)
objRecordset.MoveNext
Loop
Set objNode = Nothing
Set objRowNode = Nothing
Set objRootNode = Nothing
Set objRecordset = Nothing
%>
现在,我们就得到了一个XML DOM对象。这种方法对于记录集很大时性能并不理想,因为系统内存中要同时保存ADO记录集对象和XML DOM对象。
如何用ASP操作XML(二) [ 2005-11-01 5:16:15 PM | Author: soul | From: Original ]
第二个办法,遍历记录集,直接生成XML字符串本身:
<%
Dim strXML
strXML = "<xml>"
objRecordset.MoveFirst
Do While NOT objRecordset.EOF
strXML = strXML & "<row>"
strXML = strXML & "<ProductName>" _
& objRecordset.Fields.Item("ProductName").Value _
& "</ProductName>"
strXML = strXML & "<UnitPrice>" _
& objRecordset.Fields.Item("UnitPrice").Value _
& "</UnitPrice>"
strXML = strXML & "<UnitsInStock>" _
& objRecordset.Fields.Item("UnitsInStock").Value _
& "</UnitsInStock>"
strXML = strXML & "</row>"
objRecordset.MoveNext
Loop
strXML = strXML & "</xml>"
Set objRecordset = Nothing
%>
但是,以上两种方法最大的缺陷是不能够重用代码,我们把节点的名字都写死了,如果我们进行不同字段的查询,我们还必须手动更改我们的代码,以满足不同节点的需要。我们下面的方法将变得更加通用。
第三种方法:可重用的方法。
<%
Dim strXML
strXML = "<xml>"
objRecordset.MoveFirst
Do While NOT objRecordset.EOF
strXML = strXML & "<row>"
For Each varItem In objRecordset.Fields
strXML = strXML _
& "<" & varItem.name & ">" _
& varItem.value _
& "</" & varItem.name & ">"
Next
strXML = strXML & "</row>"
objRecordset.MoveNext
Loop
strXML = strXML & "</xml>"
Set objRecordset = Nothing
%>
一个更有效的方法,我们可以直接利用记录集内建的save方法,它能够自动地把记录集的内容转换成XML格式,我们调用save方法后,我们就可以立即释放内存中的记录集对象实例。 save方法有两个参数:一个是XML要保存的地方,一个是指示符,标明数据以何种格式保存。我们可以把数据保存成XML DOM对象(ADO STREAM对象),也可以直接保存成ASP RESPONSE对象,为通用起见,我们保存成XML DOM,第二个参数用adPersistXML ADO常量。方法如下:
<%
Const adPersistXML = 1
Dim objXMLDOM
Set objXMLDOM = Server.createObject("MSXML2.DOMDocument.3.0")
objRecordset.save objXMLDOM, adPersistXML
Set objRecordset = Nothing
%>
这种方法方便快捷,而且不容易出错,对不同的查询,也不用手动更改节点名字。但是,这种方法产生的XML不够简洁,看看它产生的结果:
<xml
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType
name="row"
content="eltOnly"
rs:CommandTimeout="30">
<s:AttributeType
name="ProductName"
rs:number="1"
rs:writeunknown="true">
<s:datatype
dt:type="string"
dt:maxLength="40"
rs:maybenull="false"/>
</s:AttributeType>
<s:AttributeType
name="UnitPrice"
rs:number="2"
rs:nullable="true"
rs:writeunknown="true">
<s:datatype
dt:type="number"
rs:dbtype="currency"
dt:maxLength="8"
rs:precision="19"
rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType
name="UnitsInStock"
rs:number="3"
rs:nullable="true"
rs:writeunknown="true">
<s:datatype
dt:type="i2"
dt:maxLength="2"
rs:precision="5"
rs:fixedlength="true"/>
</s:AttributeType>
<s:extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row
ProductName="Chai"
UnitPrice="18"
UnitsInStock="39"/>
<z:row
ProductName="Konbu"
UnitPrice="6"
UnitsInStock="24"/>
<z:row
ProductName="Tofu"
UnitPrice="23.25"
UnitsInStock="35"/>
</rs:data>
</xml>
如何用ASP操作XML(三) [ 2005-11-01 5:24:29 PM | Author: soul | From: Original ]
ADO自动产生的XML包含了schema信息,它描述这个XML里允许有什么节点和属性以及采用何种数据类型,而且数据节点也增加了名称空间。schema信息在需要数据验证的地方或进行更复杂的处理或许很有用,但是,大多数情况下,我们使用的是瘦客户机,我们不需要schema信息。我们可以利用XSLT来分离出我们想要的信息,去掉多余的信息。因此,我们编写下面的" DataCleaner.xsl":
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:element name="xml">
<xsl:for-each select="/xml/rs:data/z:row">
<xsl:element name="row">
<xsl:for-each select="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这个XSLT具有可重用的特性,对于不同的查询结果都适用,下面就是如何使用这个XSLT的例子:
<%
Dim strCleanXML, objXMLDOM_XSLT
Set objXMLDOM_XSLT = createObject("MSXML2.DOMDocument")
objXMLDOM_XSLT.load(Server.MapPath("DataCleaner.xsl"))
strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)
Set objXMLDOM = Nothing
Set objXMLDOM_XSLT = Nothing
%>
经过上面的处理以后,strClaenXML就是我们所想要的XML字符串了。
<xml>
<row>
<ProductName>Chai</ProductName>
<UnitPrice>18</UnitPrice>
<UnitsInStock>39</UnitsInStock>
</row>
<row>
<ProductName>Konbu</ProductName>
<UnitPrice>6</UnitPrice>
<UnitsInStock>24</UnitsInStock>
</row>
</xml>
上面这种格式的XML字符串是我们经常见到的节点集的样式,如果您不想把字段处理成节点,而把它处理成属性节点,那么我们只需对DataCleaber.xsl稍加改动即可:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:element name="xml">
<xsl:for-each select="/xml/rs:data/z:row">
<xsl:element name="row">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
以下是采用了新样式的结果,它比用节点表示字段的长度要短的多了。传输起来速度会更快:
<xml>
<row ProductName="Chai" UnitPrice="18" UnitsInStock="39"/>
<row ProductName="Konbu" UnitPrice="6" UnitsInStock="24"/>
</xml>
到此为止,我们介绍了从ADO 记录集得到XML格式数据的几种办法,也得到了最简化的字符串。但是有几个问题你仍然需要注意,有些字段值还有XML里不支持的字符,比如:"'<>&,象P&G宝洁公司的名称,Chef Anton's Gumbo Mix产品名字等,在做转换时要进行编码处理。在Microsoft ADO 2.6的SDK里有使用save方法时要注意的问题:1,save方法只对open Recordset起作用;2,不支持带有adVariant,adIDispatch,adIUnknown类型的字段的记录集的savw;3,当保存分级的记录集( data shapes)有两个限制:不能保存参数化和含有未解决的更新的记录集。
如何用ASP操作XML(四) [ 2005-11-17 8:49:22 AM | Author: soul | From: Original ]
为了更进一步提高性能,你可以把转换工作放到COM/COM+组件中, ASP代码只进行数据的最终表现即可。把业务层、数据层和表现层分开,ASP只需要调用数据组件,数据组件调用数据库的存储过程,把结果转换成XML,最后只把简单的XML字符环串回到ASP程序里,ASP就可以用XSLT把XML进行转换,把结果送到浏览器。
<!--#i nclude file="hotTemplat.asp"-->
<%
startime=timer()
dim tp
set tp=new hotTemplate
dim tkey(2)
tkey(0)="t1"
tkey(1)="t2"
dim tval(2)
tval(0)="v1"
tval(1)="v2"
'tp.loadfile "t.htm"
tp.loadfile_fromcache "t.htm"
tp.set_var "head","GOOD"
tp.set_var "b2name","fkjdslajflksdakjlfjsdalkjflsadjkfljsad"
tp.set_var tkey,tval
tp.set_block "b"
for tmpc=1 to 10
tp.set_bvar "t1","alax"&tmpc
tp.set_bvar "t2","proa"&tmpc
tp.set_bvar "t3","hotsjf"&tmpc
tp.prase_block(10-tmpc)
next
tp.set_block "aa"
for tmpc=1 to 10
tp.set_bvar "bt1","haha"&tmpc
tp.set_bvar "bt2","hehe"&tmpc
tp.prase_block(10-tmpc)
next
tp.prase_file()
tp.output()
Response.Write("<hr><b>[Executing Time: "&FormatNumber((timer()-startime)*1000,3)&" Milliseconds.]</b><br>")
'tp.out_file("tt.htm")
%>
模板(页面):t.htm
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
<span class="style1">{head}</span> is a hotTemplate show!!
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>title1</td>
<td>title2</td>
<td>title3</td>
</tr>
<!-- begin block b -->
<tr>
<td>{t1}</td>
<td>{t2}</td>
<td>{t3}</td>
</tr>
<!-- end block b -->
</table>
<p><br>
here is anther block {b2name} </p>
<table width="100%" border="0" cellpadding="0" cellspacing="1" bordercolor="#CCCCCC" bgcolor="#666666">
<tr bgcolor="#FFFFFF">
<td>bt1</td>
<td>bt2</td>
</tr>
<!-- begin block aa -->
<tr bgcolor="#FFFFFF">
<td>{bt1}</td>
<td>{bt2}</td>
</tr>
<!-- end block aa -->
</table>
<br>t1={t1}<br>t2={t2}<br>{tun}<br><br><br>
<p> </p>
xmldocument.CreateNode()是建立一个节点
xmldocument.CreateElement是创建一个实体(有内容)
xmldocument.CreateNode()也可以有内容吧 譬如XmlNode newElem=doc.CreateNode(XmlNodeType.Element, "pages", "");
newElem.InnerText = "290";
真是不懂了
createNode可以带名称空间
createElement 不可以
Node是Element 的父类,Node包含Element
使用XML DOM生成XML(2)创建结点
XMLDOMDocument 对象提供了创建结点或者XMLDOMNode的两种方法: CreateElement 和CreateNode。选择其中哪一种方法,取决于你需要结点提供信息量的多少。当你使用CreateElement 方法时,只要提供结点名称,如
Set objXMLroot = objXMLdoc _
.CreateElement("ORDER_STATUS")
当使用CreateNode 方法时,你要指定结点类型,结点名称和相关名域。(XML名域可以让你择同一文档中用同一名称创建多个XML元素) 例如,如果要使用CreateNode方法,你可写出如下代码:
Set objXMLroot = objXMLdoc _
.createNode("element", _
"ORDER_STATUS", "Space1")
一旦创建了结点,你须把它添加进XML文档中。这就要用AppendChild 方法,例如,继续上面的例子,你可以写出:
objXMLdoc.AppendChild(objXMLroot)
该语句创建了XML根结点,请见图A在Internet Explorer 5.0中的例子。
图A:用XML DOM 创建XML文档的根结点
除了AppendChild方法外,XMLDOMNode 对象也具有其它三个控制XML结点的方法: ReplaceChild, RemoveChild和InsertBefore
使用XML DOM生成XML(3)对结点的属性赋值
一旦创建了结点,还要对其属性赋值,如独立的标识符,或者特性值。你要用到SetAttribute方法。该方法接收两个参数— 属性名和属性值。例如,下列代码创建了属性名SHIPPING_DATASOURCE 和属性值NORTH_ATLANTIC_SHIPPING:
objXMLroot.SetAttribute _
"SHIPPING_DATASOURCE", _
"NORTH_ATLANTIC_SHIPPING"
此时,我们生成了图B的XML文档。
图B: SetAttributes方法创建了结点属性
加入子结点
要创建子结点,你可以使用我们前面介绍的CreateElement或者 CreateNode 方法,然后把它们添加到合适的父母结点中。例如,假设,我们要创建称为PUBLISHER_DISCLAIMER的XML结点。为了做到这一点,我们把该结点附加到文档的根结点中,代码如下:
Set objXMLChildTestNode = objXMLdoc _
.createNode("element", _
"PUBLISHER_DISCLAIMER", "")
objXMLdoc.DocumentElement _
.appendChild (objXMLChildTestNode
)
注意:我们使用了XMLDOMDocument的 DocumentElement 特性来把新结点添加到XML文档的根结点中,请见图C。
图C:要添加子结点,你只需把它们添加到父母结点中。
给结点赋值
一旦创建完所有的结点,你将需要给它们赋值。那是XML最关键的步骤。要做到这点,你同平常一样,创建一个结点,然后对该结点的TEXT属性赋值。例如,下列代码创建了称为PUBLISHED_DATE的XML结点,然后赋值如下:
Set objPublishDate = objXMLdoc _
.CreateNode("element", _
"PUBLISHED_DATE", "")
dShippedDate = FormatDateTime(Date, 2)
objPublishDate.Text = dShippedDate
objXMLChildTestNode.appendChild _
(objPublishDate)
结果请见图D。
图D: 我们对把当前日期赋给PUBLISHED_DATE的Text属性,然后把该结点添加到PUBLISHER_DISCLAIMER元素中。
我们目前已经介绍了若干XML DOM
DOM 学习过程 之二
声明:本文章版权归作者jAsOn GuO拥有。未经许可,严禁转载。
今天醒来精神,索性来个全面点的文章!一口气做个添加,修改,删除的教程.
一、添加
先给一个最简单的示范例子:
<%
xmlFile = "append.xml"
Set objXML = server.createObject("microsoft.XMLDOM")
objXML.async = false
objXML.load(server.MapPath(xmlFile))
Set objRoot = objXML.createNode("element", "id", "")
objRoot.text = "0001"
objXML.appendChild(objRoot)
Set objNode = objXML.createNode("element", "body", "")
objNode.text = "这是正文"
objRoot.appendChild(objNode)
Set objNode = objXML.createNode("element", "body2", "")
objNode.text = "这是正文2"
objRoot.appendChild(objNode)
objXML.save(server.MapPath(xmlFile))
Set objXML = Nothing
%>
注:使用前必须在同目录建立一个空的XML文件:append.xml,并赋予相应的权限(Internet 来宾帐户的“写入”权限).
答案没一点点奇怪:
<id>0001<body>这是正文</body><body2>这是正文2</body2></id>
但不要太着意.下面再举个例子.首先定义XML(append2.xml)文件如:
<?xml version="1.0" encoding="GB2312"?>
<bbs>
</bbs>
ASP文件定义如下:
<%
xmlFile = "append2.xml"
Set objXML = server.createObject("microsoft.XMLDOM")
objXML.async = false
objXML.load(server.MapPath(xmlFile))
'写入子节点
Set rootNode = objXML.documentElement '根节点
Set topicNode = objXML.createElement("topic") '创建节点
rootNode.appendChild(topicNode) '加入根节点对象里
topicNode.text ="aa" '并设置值
objXML.save(server.MapPath(xmlFile)) '保存
Set objXML = Nothing
%>
当然,你可以这样写:
<%
xmlFile = "append2.xml"
Set objXML = server.createObject("microsoft.XMLDOM")
objXML.async = false
objXML.load(server.MapPath(xmlFile))
'写入子节点
Set rootNode = objXML.documentElement
Set topicNode = objXML.createNode("element","topic","")
rootNode.appendChild(topicNode)
topicNode.text ="aa"
objXML.save(server.MapPath(xmlFile))
Set objXML = Nothing
%>
结果当然如下:
<?xml version="1.0" encoding="GB2312"?>
<bbs>
<topic>aa</topic></bbs>
哈哈,还不明白吗?
看看createNode方法的重载:
public virtual XmlNode CreateNode(
string nodeTypeString,
string name,
string namespaceURI
);
public virtual XmlNode CreateNode(
XmlNodeType type,
string name,
string namespaceURI
);
public virtual XmlNode CreateNode(
XmlNodeType type,
string prefix,
string name,
string namespaceURI
);
很简单,如果不明白,请先参考相关API文档.
二、修改
修改更简单!给个最简单的例子啦.本例使用学习过程之一的XML文档(beauty.xml):
<?xml version="1.0" encoding="GB2312"?>
<lists>
<beauty size="32B,22,33">
<name>Lucy</name>
<age>18</age>
<fromWhere>GuangDong</fromWhere>
</beauty>
<beauty size="33C,21,34">
<name>LuLu</name>
<age>22</age>
<fromWhere>GuangZhou</fromWhere>
</beauty>
</lists>
嘿嘿,为什么美女都是英文名字?难道中国就没有美女吗?来,跟我一起将它改为中国人名字:
ASP代码如下:
<%
xmlFile = "beauty.xml"
Set objXML = server.createObject("microsoft.XMLDOM")
objXML.async = false
objXML.load(Server.MapPath(xmlFile))
'修改XML文件内容
Set objRoot = objXML.documentElement '取得根节点
objRoot.childNodes.item(0).childNodes.item(0).text = "猪茵"
objRoot.childNodes.item(1).childNodes.item(0).text = "傻丫"
objXML.save(Server.MapPath(xmlFile))
%>
结果是XML文件变成:
<?xml version="1.0" encoding="GB2312"?>
<lists>
<beauty size="32B,22,33">
<name>猪茵</name>
<age>18</age>
<fromWhere>GuangDong</fromWhere>
</beauty>
<beauty size="33C,21,34">
<name>傻丫</name>
<age>22</age>
<fromWhere>GuangZhou</fromWhere>
</beauty>
</lists>
这两个美女的名字可够恐怖的了!!!修改就是直接赋予新的值就是了,哪怕是属性,道理也是一样的!
三、删除
删除是够恐怖的,就如你钱包里的钱不见了一样.但有时候钱总是要花的....
读者:@#$@#%$#$%^$ ,胡乱说什么?...(此处省略粗口一千三百五十七句)
XML就用上面修改为中文以后的哪个!看看ASP文件怎么说:
<%
xmlFile = "beauty.xml"
Set objXML = server.createObject("microsoft.XMLDOM")
objXML.async = false
objXML.load(Server.MapPath(xmlFile))
'删除XML文件内容
Set objAge = objXML.documentElement.SelectSingleNode("//beauty/age")
Set objBeauty = objXML.documentElement.selectSingleNode("//beauty")
objBeauty.removeChild objAge
objXML.save(Server.MapPath(xmlFile))
%>
所以你的钱包,噢,不。是你的XML文件变成这个样子了:
<?xml version="1.0" encoding="GB2312"?>
<lists>
<beauty size="32B,22,33">
<name>猪茵</name>
<fromWhere>GuangDong</fromWhere>
</beauty>
<beauty size="33C,21,34">
<name>傻丫</name>
<age>22</age>
<fromWhere>GuangZhou</fromWhere>
</beauty>
</lists>
通过父亲杀儿子.....没什么问题吧? ^_^ XML里没有大逆不道的事情,所以不允许儿子杀父亲.
DOM 学习过程 之一
声明:本文章版权归作者jAsOn GuO拥有。未经许可,严禁转载。
我学习DOM之过程,绝对是艰苦的.上IBM,发现里面有好教程,但是是Java,虽然我懂得Java,但我需要的是VBScript的教程/文章.
好不容易找到几篇,荀子的文章看起来不错(对于学习).只可惜代码有问题..对于我本来不懂DOM的人而言.实在没作用!!而文中所举网站地址与电子邮箱,经我亲自测试,发送邮件.都没反应; 另外一篇做了一个通讯录,例子虽好,但代码文件过多.看起来比较费时间而得不到什么启示.苦恼了几天,上CSDN找,终于有些眉目.鉴于亲身体现这种缺乏简单教学资料的情况,我决定将DOM基础知识写下来,于是就有了此文章.
本文不假定你有任何DOM知识-因为在写这个教程的同时,笔者还完全不会DOM!但必须懂得基础的XML知识.这是必须的也是最基础要求.
好了,开门见山.假设我们的XML文件(保存为beauty.xml)定义如下:
<?xml version="1.0" encoding="GB2312"?>
<lists>
<beauty>
<name>Lucy</name>
<age>18</age>
<fromWhere>GuangDong</fromWhere>
</beauty>
<beauty>
<name>LuLu</name>
<age>22</age>
<fromWhere>GuangZhou</fromWhere>
</beauty>
</lists>
嘿嘿,你准在笑我色狼:怎么两个美女都18,22这个好年龄!? 呵呵,但这个和我们做的示范例子效果无关,所以继续:
先给个最简单的读取数据代码示范例子吧:
<%
Dim xmlDom,rootNode
xmlFileName = "beauty.xml"
Set xmlDom = Server.CreateObject("Microsoft.XMLDOM") '建立DOM对象
xmlDom.async = false
If not xmlDom.Load(Server.MapPath(xmlFileName)) Then
Response.Write "XML文件加载失败!"
Response.End
Else
Set rootNode = xmlDom.documentElement '获得根元素
Response.Write rootNode.childNodes.item(0).text
'意思就是:打印出根元素下子节点第(0)个元素的值
Response.Write "<BR>"
Response.Write rootNode.childNodes.item(1).text
'下面看看我怎么把Lucy从XML里拉出来!
Response.Write "<BR>"
Set nameNode = rootNode.childNodes.item(0).childNodes.item(0)
'意思就是:把根节点(rootNode)下,第0个子节点(beauty)的第0个子节点(name).赋给nameNode变量.
Response.Write nameNode.text
End If
%>
另外:async属性用来指明是否允许异步下载,默认值为true。我们给async赋值为false,表明只有当文档下载完毕,控制才返回给调用进程。
没错,就是这么简单!!!!! 可怜我看的文章,都是长篇大论的在讨论如何控制循环来打印所有记录或者打印部分记录.但很多初级读者,需要的是简单,而不至于使他们迷失方向的文章/代码!!
呵呵,如果我说到这样详细和简单,您还是不明白的话.可以给我发信告诉我,那里不懂.我会回复并考虑在此文章里加上这个问题的更详细描述.
接下来,我并不打算马上说循环打印所有记录-这个很简单,相信聪明的你已经想到程序该如何写.下面我说说属性的读取方法,为实验所以修改XML如下:
<?xml version="1.0" encoding="GB2312"?>
<lists>
<beauty size="32B,22,33">
<name>Lucy</name>
<age>18</age>
<fromWhere>GuangDong</fromWhere>
</beauty>
<beauty size="33C,21,34">
<name>LuLu</name>
<age>22</age>
<fromWhere>GuangZhou</fromWhere>
</beauty>
</lists>
我又听到有人说我是色狼了 :),没错,这三围的属性,实在令很多男人流鼻血.你如果也流,那请在流完以后继续:
其实打印属性出来,是很简单的.修改上面的程序,写成:
<%
Dim xmlDom,rootNode
xmlFileName = "beauty.xml"
Set xmlDom = Server.CreateObject("Microsoft.XMLDOM") '建立DOM对象
xmlDom.async = false
If not xmlDom.Load(Server.MapPath(xmlFileName)) Then
Response.Write "XML文件加载失败!"
Response.End
Else
Set rootNode = xmlDom.documentElement '获得根元素
Response.Write rootNode.childNodes.item(0).text
'意思就是:打印出根元素下子节点第(0)个元素的值
Response.Write " 她的三围是: "
Response.Write rootNode.childNodes.item(0).attributes(0).text
Response.Write "<BR>"
Response.Write rootNode.childNodes.item(1).text
Response.Write " 她的三围是: "
Response.Write rootNode.childNodes.item(1).attributes(0).text
'下面看看我怎么把Lucy从XML里拉出来!
Response.Write "<BR>"
Set nameNode = rootNode.childNodes.item(0).childNodes.item(0)
'意思就是:把根节点(rootNode)下,第0个子节点(beauty)的第0个子节点(name).赋给nameNode变量.
Response.Write nameNode.text
End If
%>
看,添加的代码,我已经用粗体表示出来了.简单不?(学DOM,英文好一点有好处,不会英文相对而言没那么好!)
如果你没带任何疑问来到这里,相信我已经把你拉进了DOM的门口了! :)
深入导学:
1.搞清楚下面这个ASP程序:
<%
strXML="<root>" &_
"<booklist>"&_
"<book name='xml' />"&_
"<book id='0002' name='asp' />"&_
"<book id='0003' name='jsp' />"&_
"</booklist>"&_
"<bookfav>"&_
"<item name='xml' id='0001'/>"&_
"<item name='asp' id='0002'/>"&_
"<item name='jsp' id='0003'/>"&_
"</bookfav>"&_
"</root>"
Set xmlDoc= Server.CreateObject("MSXML2.DOMDocument")
xmlDoc.loadXML strXML
Set bookNodes = xmlDoc.selectNodes("//book")
For Each node In bookNodes
For i = 0 To node.attributes.length - 1
Response.write node.attributes(i).name & "=" & node.attributes(i).value & " "
Next
Response.write "<p>"
Next
%>
参考资料:
http://expert.csdn.net/Expert/topic/2651/2651729.xml?temp=.9963343
字体大小: 小 中 大
使用ASP添加xml节点功能
相关方法:
createNode(type, name, nameSpaceURI);//建立一个指定型态、名称,及命名空间的新节点
setAttribute( name , value );//在指定的节点插入一个新的属性,如果属性名已经存在,则替换原属性名的值
appendChild(newChild);//加上一个节点当作指定节点最后的子节点。
insertBefore(newChild,refChild);//在指定的节点前插入一个子节点。
xmlDocument.save(url);//保存操作.
实例:
Vbscript
引用: 程序代码
set Doc = CreateObject("Microsoft.XMLDOM")
Doc.async = false
Doc.load(Server.MapPath("data.xml"))
set root = Doc.DocumentElement
set book = Doc.createNode(1,"book","")
set bookname = Doc.createNode(1,"name","")
set publisher = Doc.createNode(1,"publisher","")
set img = Doc.createNode(1,"img","")
bookname.text = "Coldfusion"
publisher.text = "上海教育出版社"
img.text = "img/5.jpg"
book.appendChild(bookname)
book.appendChild(publisher)
book.appendChild(img)
root.appendChild(book)
Doc.Save(Server.MapPath("data.xml"))
call Doc.getElementsByTagName("book").item(Doc.DocumentElement.childNodes.length-1).setAttribute("cost","200") '通过length来获取需要添加属性的节点所在的位置.
Doc.Save(Server.MapPath("data.xml"))
Xml
引用:
程序代码
<data>
<book cost="56">
<name>Dreamweaver</name>
<publisher>上海科技出版社</publisher>
<img>img/dw.jpg</img>
</book>
<book cost="62">
<name>Flash</name>
<publisher>铁道出版社</publisher>
<img>img/flash.jpg</img>
</book>
<book cost="48">
<name>Firweorks</name>
<publisher>教育出版社</publisher>
<img>img/fw.jpg</img>
</book>
</data>
c# xml操作类
public class XmlControl
{
protected string strXmlFile;
protected XmlDocument objXmlDoc = new XmlDocument();
public XmlControl(string XmlFile)
{
//
// TODO: 在这里加入建构函式的程式码
//
try
{
objXmlDoc.Load(XmlFile);
}
catch (System.Exception ex)
{
throw ex;
}
strXmlFile = XmlFile;
}
public DataView GetData(string XmlPathNode)
{
//查找数据。返回一个DataView
DataSet ds = new DataSet();
StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
ds.ReadXml(read);
return ds.Tables[0].DefaultView;
}
public void Replace(string XmlPathNode,string Content)
{
//更新节点内容。
objXmlDoc.SelectSingleNode(XmlPathNode).InnerText = Content;
}
public void Delete(string Node)
{
//删除一个节点。
string mainNode = Node.Substring(0,Node.LastIndexOf("/"));
objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node));
}
public void InsertNode(string MainNode,string ChildNode,string Element,string Content)
{
//插入一节点和此节点的一子节点。
XmlNode objRootNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);
objRootNode.AppendChild(objChildNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.InnerText = Content;
objChildNode.AppendChild(objElement);
}
public void InsertElement(string MainNode,string Element,string Attrib,string AttribContent,string Content)
{
//插入一个节点,带一属性。
XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.SetAttribute(Attrib,AttribContent);
objElement.InnerText = Content;
objNode.AppendChild(objElement);
}
public void InsertElement(string MainNode,string Element,string Content)
{
//插入一个节点,不带属性。
XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.InnerText = Content;
objNode.AppendChild(objElement);
}
public void Save()
{
//保存文档。
try
{
objXmlDoc.Save(strXmlFile);
}
catch (System.Exception ex)
{
throw ex;
}
objXmlDoc = null;
}
}
=========================================================
实例应用:
string strXmlFile = Server.MapPath("TestXml.xml");
XmlControl xmlTool = new XmlControl(strXmlFile);
// 数据显视
// dgList.DataSource = xmlTool.GetData("Book/Authors[ISBN=\"0002\"]");
// dgList.DataBind();
// 更新元素内容
// xmlTool.Replace("Book/Authors[ISBN=\"0002\"]/Content","ppppppp");
// xmlTool.Save();
// 添加一个新节点
// xmlTool.InsertNode("Book","Author","ISBN","0004");
// xmlTool.InsertElement("Book/Author[ISBN=\"0004\"]","Content","aaaaaaaaa");
// xmlTool.InsertElement("Book/Author[ISBN=\"0004\"]","Title","Sex","man","iiiiiiii");
// xmlTool.Save();
// 删除一个指定节点的所有内容和属性
// xmlTool.Delete("Book/Author[ISBN=\"0004\"]");
// xmlTool.Save();
// 删除一个指定节点的子节点
// xmlTool.Delete("Book/Authors[ISBN=\"0003\"]");
// xmlTool.Save();
xml文件操作小结(3)---selectsinglenode方法中的xpath%%%%转自酷网动力(www.ASPCOOL.COM)。
最常见的XML数据类型有:Element, Attribute,Comment, Text.
Element, 指形如<Name>Tom<Name>的节点。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference.
Attribute, 指在<Employee id=”12345”>中的粗体部分。
Comment,指形如:<!-- my comment --> 的节点。
Text,指在<Name>Tom<Name>的粗体部分。
在XML中,可以用XmlNode对象来参照各种XML数据类型。
2.1 查询已知绝对路径的节点(集)
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”)
或者
objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”)
以上两种方法可返回一个NodeList对象,如果要返回单个节点可使用SelectSingleNode方法,该方法如果查询到一个或多个节点,返回第一个节点;如果没有查询的任何节点返回 Nothing。例如:
objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”)
If Not (objNode is Nothing) then
‘- Do process
End If
2.2 查询已知相对路径的节点(集)
可使用类似于文件路径的相对路径的方式来查询XML的数据
objNode = objDoc.SelectSingleNode(“Company/Department”)
objNodeList = objNode.SelectNodes(“../Department)
objNode = objNode.SelectNode(“Employees/Employee”)
2.3 查询已知元素名的节点(集)
在使用不规则的层次文档时,由于不知道中间层次的元素名,可使用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素。例如:
objNodeList = objDoc.SelectNodes(“Company//Employee”)
2.4 查询属性(attribute)节点
以上的各种方法都返回元素(element)节点(集),返回属性(attribute),只需要采用相应的方法,在属性名前加一个@符号即可,例如:
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”)
objNodeList = objDoc.SelectNodes(“Company//@id”)
2.5 查询Text节点
使用text()来获取Text节点。
objNode = objDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”)
2.6 查询特定条件的节点
使用[]符号来查询特定条件的节点。例如:
a. 返回id号为 10102的Employee节点
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)
b. 返回Name为Zhang Qi的Name 节点
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”)
c. 返回部门含有职员22345的部门名称节点
objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name")
2.7 查询多重模式的节点
使用 | 符号可以获得多重模式的节点。例如:
objNodeList = objDoc.SelectNodes(“Company/Department/Department_Name | Company/Department/Manager”)
2.8 查询任意子节点
使用*符号可以返回当前节点的所有子节点。
objNodeList = objDoc.SelectNodes(“Company/*/Manager)
或者
objNodeList = objNode.ChildNodes
3 XML数据的编辑
3.1 增加一个元素的属性(attribute)节点
Dim objNodeAttr As XmlNode
objNodeAttr = objDoc.CreateAttribute("id", Nothing)
objNodeAttr.InnerXml = "101"
objNode.Attributes.Append(objNodeAttr)
3.2 删除一个元素的属性
objNode.Attributes.Remove(objNodeAttr)
3.3 增加一个子元素(Element)
Dim objNodeChild As XmlNode
objNodeChild = objDoc.CreateElement(Nothing, "ID", Nothing)
objNodeChild.InnerXml = "101"
objNode.AppendChild(objNodeChild)
3.4 删除一个子元素
objNode.RemoveChild(objNodeChild)
3.5 替换一个子元素
objNOde.ReplaceChild(newChild,oldChild)
4 参考数据
<?xml version="1.0" encoding="UTF-8"?>
<Company>
<Department id="101">
<Department_Name>Cai WuBu</Department_Name>
<Manager>Zhang Bin</Manager>
<Employees>
<Employee id="12345">
<Employee_ID>12345</Employee_ID>
<Name>Zhang Bin</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10101">
<Employee_ID>10101</Employee_ID>
<Name>Zhang QI</Name>
<Gender>female</Gender>
</Employee>
<Employee id="10102">
<Employee_ID>10102</Employee_ID>
<Name>Zhang Xia</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10201">
<Employee_ID>10201</Employee_ID>
<Name>ZhangChuang</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10202">
<Employee_ID>10202</Employee_ID>
<Name>Zhang Jun</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
<Department id="102">
<Department_Name>KaiFa Bu</Department_Name>
<Manager>Wang Bin</Manager>
<Employees>
<Employee id="22345">
<Employee_ID>22345</Employee_ID>
<Name>Wang Bin</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20101">
<Employee_ID>20101</Employee_ID>
<Name>Wang QI</Name>
<Gender>female</Gender>
</Employee>
<Employee id="20102">
<Employee_ID>20102</Employee_ID>
<Name>Wang Xia</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20201">
<Employee_ID>20201</Employee_ID>
<Name>Wang Chuang</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20202">
<Employee_ID>20201</Employee_ID>
<Name>Wang Jun</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
</Company>
技巧百问(9):ASP.NET和C#中对XML的操作,以及简单的xml与xsl !
随着不断的学习,对asp.net c#的了解,越来越觉得xml很好,但是有些还是要和sql联用,并不象有些人夸大说的替代sql了,这里讲讲我自己的用的一些经验。
asp.net创建xml就是通过创建DataTable来创建xml中的树型等
1 DataSet objset=new DataSet();
2 DataTable istable=new DataTable("test");
3 istable.Columns.Add("rate1",typeof(int));
4 istable.Columns.Add("rate2",typeof(int));
5 istable.Columns.Add("rate3",typeof(int));
6 istable.Columns.Add("rate4",typeof(int));
7 objset.Tables.Add(istable);
8
9 DataRow dr=objset.Tables["test"].NewRow();
10 dr[0]=赋值;
11 dr[1]=赋值;
12 dr[2]=赋值;
13 dr[3]=赋值;
14 objset.Tables["money"].Rows.Add(dr);
15
16 objset.WriteXml(Server.MapPath("test.xml"),XmlWriteMode.WriteSchema);
其中就是先创建DataSet和DataTable,其中建立的表为test,再在表中添加子项rate1,2,3,4,再定义新的行,分别添加对应的值,最后这些都已经写进DataSet表中,通过DataSet把xml输入就完成了。要读就只需要把xml的数据读到DataSet中,再通过DataSet中的表的项来对应读出数据。
而C#中则使用的DOM来实现操作,比如现有一个bookstore.xml文件,内容如下
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
</bookstore>
下面讲解4种常用的方法
1、往<bookstore>节点中插入一个<book>节点:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS从入门到精通";//设置文本节点
xe1.AppendChild(xesub1);//添加到<book>节点中
XmlElement xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>节点中
xmlDoc.Save("bookstore.xml");
//================
结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</book>
</bookstore>
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
foreach(XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
{
xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
{
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亚胜";//则修改
break;//找到退出来就可以了
}
}
break;
}
}
xmlDoc.Save("bookstore.xml");//保存。
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="update李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>亚胜</author>
<price>58.3</price>
</book>
</bookstore>
3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode xn in xnl)
{
XmlElement xe=(XmlElement)xn;
if(xe.GetAttribute("genre")=="fantasy")
{
xe.RemoveAttribute("genre");//删除genre属性
}
else if(xe.GetAttribute("genre")=="update李赞红")
{
xe.RemoveAll();//删除该节点的全部内容
}
}
xmlDoc.Save("bookstore.xml");
//====================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book>
</book>
</bookstore>
4、显示所有数据。
XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList xnl=xn.ChildNodes;
foreach(XmlNode xnf in xnl)
{
XmlElement xe=(XmlElement)xnf;
Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
Console.WriteLine(xe.GetAttribute("ISBN"));
XmlNodeList xnf1=xe.ChildNodes;
foreach(XmlNode xn2 in xnf1)
{
Console.WriteLine(xn2.InnerText);//显示子节点点文本
}
}
以上的就是ASP.NET和C#对xml的基本使用方法。下面说一下xml和xsl,从抽象的来说,我个人觉得xml象是数据库,而xsl就象是过滤的。xsl中可以加入html等语法,也可以加入xml的语法等,可以列出需要的数据等。
现有一个xml文件,内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<NewDataSet>
<Table id="1">
<ProductID>1001</ProductID>
<CategoryID>1</CategoryID>
</Table>
<Table id="2">
<ProductID>1002</ProductID>
<CategoryID>2</CategoryID>
</Table>
</NewDataSet>
其中第2句是引用xsl,xsl内容如下
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<center>
<h2>the notepad</h2>
<table border="1">
<tr>
<td>id</td>
<td>name</td>
</tr>
<xsl:for-each select="NewDataSet/Table">
<tr>
<td><xsl:value-of select="ProductID"/></td>
<td><xsl:value-of select="ProductName"/></td>
</tr>
</xsl:for-each>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
中间的for-each就是循环遍历节点,获取指定的select后的内容,下面的value-of就相当于sql中字段名。在使用xsl的时候,还可以查询某一个值,这样xsl就需要如下<xsl:value-of select="/students/student[@id='2']/ProductID"/>
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<center> <h1>id号是"2"的厂家的产品ID是:<xsl:value-of select="/NewDataSet/Table[@id='2']/ProductID"/></h1></center>
</xsl:template>
</xsl:stylesheet>
有些如果在Table下还有节点,要显示这个节点下的东西xsl就该如下
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<center>
<h2>the notepad</h2>
<table border="1">
<tr>
<td>随便写</td>
</tr>
<xsl:for-each select="NewDataSet/Table/xx/*">
<tr>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
1、往<bookstore>节点中插入一个<book>节点:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS从入门到精通";//设置文本节点
xe1.AppendChild(xesub1);//添加到<book>节点中
XmlElement xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>节点中
xmlDoc.Save("bookstore.xml");
//================
结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</book>
</bookstore>
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
foreach(XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
{
xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
{
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亚胜";//则修改
break;//找到退出来就可以了
}
}
break;
}
}
xmlDoc.Save("bookstore.xml");//保存。
//=================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="update李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>亚胜</author>
<price>58.3</price>
</book>
</bookstore>
3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode xn in xnl)
{
XmlElement xe=(XmlElement)xn;
if(xe.GetAttribute("genre")=="fantasy")
{
xe.RemoveAttribute("genre");//删除genre属性
}
else if(xe.GetAttribute("genre")=="update李赞红")
{
xe.RemoveAll();//删除该节点的全部内容
}
}
xmlDoc.Save("bookstore.xml");
//====================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book>
</book>
</bookstore>
4、显示所有数据。
XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList xnl=xn.ChildNodes;
foreach(XmlNode xnf in xnl)
{
XmlElement xe=(XmlElement)xnf;
Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
Console.WriteLine(xe.GetAttribute("ISBN"));
XmlNodeList xnf1=xe.ChildNodes;
foreach(XmlNode xn2 in xnf1)
{
Console.WriteLine(xn2.InnerText);//显示子节点点文本
}
}
以上的就是ASP.NET和C#对xml的基本使用方法。下面说一下xml和xsl,从抽象的来说,我个人觉得xml象是数据库,而xsl就象是过滤的。xsl中可以加入html等语法,也可以加入xml的语法等,可以列出需要的数据等。
现有一个xml文件,内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<NewDataSet>
<Table id="1">
<ProductID>1001</ProductID>
<CategoryID>1</CategoryID>
</Table>
<Table id="2">
<ProductID>1002</ProductID>
<CategoryID>2</CategoryID>
</Table>
</NewDataSet>
其中第2句是引用xsl,xsl内容如下
<%
Dim xmlDoc, rootEl, child1, child2, p'Create an XML document
Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")'Create a root element and append it to the document
Set rootEl = xmlDoc.createElement("root")
xmlDoc.appendChild rootEl
Set child1 = xmlDoc.createElement("child1")
Set child2 = xmlDoc.createElement("child2")
Set child2_1 = xmlDoc.createElement("child2_1")
rootEl.appendChild child1
rootEl.appendChild child2
child2.appendChild child2_1
child2_1.text="三月江南"
'Add an XML processing instruction
'and insert it before the root element
Set p=xmlDoc.createProcessingInstruction("xml","version='1.0'")
xmlDoc.insertBefore p,xmlDoc.childNodes(0)'Save the XML file to the c directory
xmlDoc.Save "E:\test.xml"
%>