<%
Class XMLDOMDocument
Private fNode
,fANode
Private fErrInfo
,fFileName
,fOpen
Dim XmlDom
'返回节点的缩进字串
Private Property Get TabStr
(byVal Node
)
TabStr
=
""
If Node Is Nothing Then Exit Property
If
not Node
.
parentNode Is nothing Then TabStr
=
" "
&TabStr
(Node
.
parentNode
)
End Property
'返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象
Public Property Get ChildNode
(byVal ElementOBJ
,byVal ChildNodeObj
,byVal IsAttributeNode
)
Dim Element
Set ChildNode
=Nothing
If IsNull
(ChildNodeObj
) Then
If IsAttributeNode
=
false Then
Set ChildNode
=fNode
Else
Set ChildNode
=fANode
End If
Exit Property
ElseIf IsObject
(ChildNodeObj
) Then
Set ChildNode
=ChildNodeObj
Exit Property
End If
Set Element
=Nothing
If LCase
(TypeName
(ChildNodeObj
)
)
=
"string"
and Trim
(ChildNodeObj
)
<
>
"" Then
If IsNull
(ElementOBJ
) Then
Set Element
=fNode
ElseIf LCase
(TypeName
(ElementOBJ
)
)
=
"string" Then
If Trim
(ElementOBJ
)
<
>
"" Then
Set Element
=XmlDom
.selectSingleNode
(
"//"
&Trim
(ElementOBJ
)
)
If Lcase
(Element
.nodeTypeString
)
=
"attribute" Then Set Element
=Element
.selectSingleNode
(
".."
)
End If
ElseIf IsObject
(ElementOBJ
) Then
Set Element
=ElementOBJ
End If
If Element Is Nothing Then
Set ChildNode
=XmlDom
.selectSingleNode
(
"//"
&Trim
(ChildNodeObj
)
)
ElseIf IsAttributeNode
=
true Then
Set ChildNode
=Element
.selectSingleNode
(
"./@"
&Trim
(ChildNodeObj
)
)
Else
Set ChildNode
=Element
.selectSingleNode
(
"./"
&Trim
(ChildNodeObj
)
)
End If
End If
End Property
'读取最后的错误信息
Public Property Get ErrInfo
ErrInfo
=fErrInfo
End Property
'给xml内容
Public Property Get xmlText
(byVal ElementOBJ
)
xmlText
=
""
If fopen
=
false Then Exit Property
Set ElementOBJ
=ChildNode
(XmlDom
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Set ElementOBJ
=XmlDom
xmlText
=ElementOBJ
.xml
End Property
'=================================================================
'类初始化
Private Sub Class_Initialize
(
)
Set XmlDom
=CreateObject
(
"Microsoft.XMLDOM"
)
XmlDom
.preserveWhiteSpace
=
true
Set fNode
=Nothing
Set fANode
=Nothing
fErrInfo
=
""
fFileName
=
""
fopen
=
false
End Sub
'类释放
Private Sub Class_Terminate
(
)
Set fNode
=Nothing
Set fANode
=Nothing
Set XmlDom
=nothing
fopen
=
false
End Sub
'=====================================================================
'建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址
'返回根结点
Function Create
(byVal RootElementName
,byVal XslUrl
)
Dim PINode
,RootElement
Set Create
=Nothing
If
(XmlDom Is Nothing
) Or
(fopen
=
true
) Then Exit
Function
If Trim
(RootElementName
)
=
"" Then RootElementName
=
"Root"
Set PINode
=XmlDom
.CreateProcessingInstruction
(
"xml"
,
"version="
"1.0"
" encoding="
"GB2312"
""
)
XmlDom
.
appendChild PINode
Set PINode
=XMLDOM
.CreateProcessingInstruction
(
"xml-stylesheet"
,
"type="
"text/xsl"
" href="
""
&XslUrl
&
""
""
)
XmlDom
.
appendChild PINode
Set RootElement
=XmlDom
.
createElement
(Trim
(RootElementName
)
)
XmlDom
.
appendChild RootElement
Set Create
=RootElement
fopen
=True
set fNode
=RootElement
End
Function
'开打一个已经存在的XML文件,返回打开状态
Function Open
(byVal xmlSourceFile
)
Open
=
false
xmlSourceFile
=Trim
(xmlSourceFile
)
If xmlSourceFile
=
"" Then Exit
Function
XmlDom
.async
=
false
XmlDom
.
load xmlSourceFile
fFileName
=xmlSourceFile
If
not IsError Then
Open
=
true
fopen
=
true
End If
End
Function
'关闭
Sub Close
(
)
Set fNode
=Nothing
Set fANode
=Nothing
fErrInfo
=
""
fFileName
=
""
fopen
=
false
End Sub
'读取一个NodeOBJ的节点Text的值
'NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode
Function getNodeText
(byVal NodeOBJ
)
getNodeText
=
""
If fopen
=
false Then Exit
Function
Set NodeOBJ
=ChildNode
(
null
,NodeOBJ
,
false
)
If NodeOBJ Is Nothing Then Exit
Function
If Lcase
(NodeOBJ
.nodeTypeString
)
=
"element" Then
set fNode
=NodeOBJ
Else
set fANode
=NodeOBJ
End If
getNodeText
=NodeOBJ
.
text
End
function
'插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。
'IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型
'插入成功就返回新插入这个节点
'BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象
Function InsertElement
(byVal BefelementOBJ
,byVal ElementName
,byVal ElementText
,byVal IsFirst
,byVal IsCDATA
)
Dim Element
,TextSection
,SpaceStr
Set InsertElement
=Nothing
If
not fopen Then Exit
Function
Set BefelementOBJ
=ChildNode
(XmlDom
,BefelementOBJ
,
false
)
If BefelementOBJ Is Nothing Then Exit
Function
Set Element
=XmlDom
.CreateElement
(Trim
(ElementName
)
)
'SpaceStr=vbCrLf&TabStr(BefelementOBJ)
'Set STabStr=XmlDom.CreateTextNode(SpaceStr)
'If Len(SpaceStr)>2 Then SpaceStr=Left(SpaceStr,Len(SpaceStr)-2)
'Set ETabStr=XmlDom.CreateTextNode(SpaceStr)
If IsFirst
=
true Then
'BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild
BefelementOBJ
.InsertBefore Element
,BefelementOBJ
.firstchild
'BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild
Else
'BefelementOBJ.appendChild STabStr
BefelementOBJ
.
appendChild Element
'BefelementOBJ.appendChild ETabStr
End If
If IsCDATA
=
true Then
set TextSection
=XmlDom
.createCDATASection
(ElementText
)
Element
.
appendChild TextSection
ElseIf ElementText
<
>
"" Then
Element
.Text
=ElementText
End If
Set InsertElement
=Element
Set fNode
=Element
End
Function
'在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性
'如果已经存在名为AttributeName的属性对象,就进行修改。
'返回插入或修改属性的Node
'ElementOBJ可以是Element对象或名,为null就取当前默认对象
Function setAttributeNode
(byVal ElementOBJ
,byVal AttributeName
,byVal AttributeText
)
Dim AttributeNode
Set setAttributeNode
=nothing
If
not fopen Then Exit
Function
Set ElementOBJ
=ChildNode
(XmlDom
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Exit
Function
Set AttributeNode
=ElementOBJ
.
attributes
.getNamedItem
(AttributeName
)
If AttributeNode Is nothing Then
Set AttributeNode
=XmlDom
.CreateAttribute
(AttributeName
)
ElementOBJ
.setAttributeNode AttributeNode
End If
AttributeNode
.
text
=AttributeText
set fNode
=ElementOBJ
set fANode
=AttributeNode
Set setAttributeNode
=AttributeNode
End
Function
'修改ElementOBJ节点的Text值,并返回这个节点
'ElementOBJ可以对象或对象名,为null就取当前默认对象
Function UpdateNodeText
(byVal ElementOBJ
,byVal NewElementText
,byVal IsCDATA
)
Dim TextSection
set UpdateNodeText
=nothing
If
not fopen Then Exit
Function
Set ElementOBJ
=ChildNode
(XmlDom
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Exit
Function
If IsCDATA
=
true Then
set TextSection
=XmlDom
.createCDATASection
(NewElementText
)
If ElementOBJ
.firstchild Is Nothing Then
ElementOBJ
.
appendChild TextSection
ElseIf LCase
(ElementOBJ
.firstchild
.nodeTypeString
)
=
"cdatasection" Then
ElementOBJ
.replaceChild TextSection
,ElementOBJ
.firstchild
End If
Else
ElementOBJ
.Text
=NewElementText
End If
set fNode
=ElementOBJ
Set UpdateNodeText
=ElementOBJ
End
Function
'返回符合testValue条件的第一个ElementNode,为null就取当前默认对象
Function getElementNode
(byVal ElementName
,byVal testValue
)
Dim Element
,regEx
,baseName
Set getElementNode
=nothing
If
not fopen Then Exit
Function
testValue
=Trim
(testValue
)
Set regEx
=New RegExp
regEx
.Pattern
=
"^[A-Za-z]+"
regEx
.IgnoreCase
=
true
If regEx
.Test
(testValue
) Then testValue
=
"/"
&testValue
Set regEx
=nothing
baseName
=LCase
(Right
(ElementName
,Len
(ElementName
)
-InStrRev
(ElementName
,
"/"
,
-1
)
)
)
Set Element
=XmlDom
.SelectSingleNode
(
"//"
&ElementName
&testValue
)
If Element Is Nothing Then
'Response.write ElementName&testValue
Set getElementNode
=nothing
Exit
Function
End If
Do While LCase
(Element
.baseName
)
<
>baseName
Set Element
=Element
.selectSingleNode
(
".."
)
If Element Is Nothing Then Exit Do
Loop
If LCase
(Element
.baseName
)
<
>baseName Then
Set getElementNode
=nothing
Else
Set getElementNode
=Element
If Lcase
(Element
.nodeTypeString
)
=
"element" Then
Set fNode
=Element
Else
Set fANode
=Element
End If
End If
End
Function
'删除一个子节点
Function removeChild
(byVal ElementOBJ
)
removeChild
=
false
If
not fopen Then Exit
Function
Set ElementOBJ
=ChildNode
(
null
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Exit
Function
'response.write ElementOBJ.baseName
If Lcase
(ElementOBJ
.nodeTypeString
)
=
"element" Then
If ElementOBJ Is fNode Then
set fNode
=Nothing
If ElementOBJ
.
parentNode Is Nothing Then
XmlDom
.removeChild
(ElementOBJ
)
Else
ElementOBJ
.
parentNode
.removeChild
(ElementOBJ
)
End If
removeChild
=True
End If
End
Function
'清空一个节点所有子节点
Function ClearNode
(byVal ElementOBJ
)
set ClearNode
=Nothing
If
not fopen Then Exit
Function
Set ElementOBJ
=ChildNode
(
null
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Exit
Function
ElementOBJ
.
text
=
""
ElementOBJ
.removeChild
(ElementOBJ
.firstchild
)
Set ClearNode
=ElementOBJ
Set fNode
=ElementOBJ
End
Function
'删除子节点的一个属性
Function removeAttributeNode
(byVal ElementOBJ
,byVal AttributeOBJ
)
removeAttributeNode
=
false
If
not fopen Then Exit
Function
Set ElementOBJ
=ChildNode
(XmlDom
,ElementOBJ
,
false
)
If ElementOBJ Is Nothing Then Exit
Function
Set AttributeOBJ
=ChildNode
(ElementOBJ
,AttributeOBJ
,
true
)
If
not AttributeOBJ Is nothing Then
ElementOBJ
.removeAttributeNode
(AttributeOBJ
)
removeAttributeNode
=True
End If
End
Function
'保存打开过的文件,只要保证FileName不为空就可以实现保存
Function Save
(
)
On Error Resume Next
Save
=
false
If
(
not fopen
)
or
(fFileName
=
""
) Then Exit
Function
XmlDom
.Save fFileName
Save
=
(
not IsError
)
If Err
.number
<
>0 then
Err
.
clear
Save
=
false
End If
End
Function
'另存为XML文件,只要保证FileName不为空就可以实现保存
Function SaveAs
(SaveFileName
)
On Error Resume Next
SaveAs
=
false
If
(
not fopen
)
or SaveFileName
=
"" Then Exit
Function
XmlDom
.Save SaveFileName
SaveAs
=
(
not IsError
)
If Err
.number
<
>0 then
Err
.
clear
SaveAs
=
false
End If
End
Function
'检查并打印错误信息
Private
Function IsError
(
)
If XmlDom
.ParseError
.errorcode
<
>0 Then
fErrInfo
=
"<h1>Error"
&XmlDom
.ParseError
.errorcode
&
"</h1>"
fErrInfo
=fErrInfo
&
"<B>Reason :</B>"
&XmlDom
.ParseError
.reason
&
"<br>"
fErrInfo
=fErrInfo
&
"<B>URL :</B>"
&XmlDom
.ParseError
.
url
&
"<br>"
fErrInfo
=fErrInfo
&
"<B>Line :</B>"
&XmlDom
.ParseError
.line
&
"<br>"
fErrInfo
=fErrInfo
&
"<B>FilePos:</B>"
&XmlDom
.ParseError
.filepos
&
"<br>"
fErrInfo
=fErrInfo
&
"<B>srcText:</B>"
&XmlDom
.ParseError
.srcText
&
"<br>"
IsError
=True
Else
IsError
=False
End If
End
Function
End Class
%
>