引子http://www.cnblogs.com/QDuck/archive/2007/01/10/617240.aspx
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();
1
<%
2
Class XMLDOMDocument
3
Private fNode,fANode
4
Private fErrInfo,fFileName,fOpen
5
Dim XmlDom
6
7
'返回节点的缩进字串
8
Private Property Get TabStr(byVal Node)
9
TabStr=""
10
If Node Is Nothing Then Exit Property
11
If not Node.parentNode Is nothing Then TabStr=" "&TabStr(Node.parentNode)
12
End Property
13
14
'返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象
15
Public Property Get ChildNode(byVal ElementOBJ,byVal ChildNodeObj,byVal IsAttributeNode)
16
Dim Element
17
Set ChildNode=Nothing
18
19
If IsNull(ChildNodeObj) Then
20
If IsAttributeNode=false Then
21
Set ChildNode=fNode
22
Else
23
Set ChildNode=fANode
24
End If
25
Exit Property
26
ElseIf IsObject(ChildNodeObj) Then
27
Set ChildNode=ChildNodeObj
28
Exit Property
29
End If
30
31
Set Element=Nothing
32
If LCase(TypeName(ChildNodeObj))="string" and Trim(ChildNodeObj)<>"" Then
33
If IsNull(ElementOBJ) Then
34
Set Element=fNode
35
ElseIf LCase(TypeName(ElementOBJ))="string" Then
36
If Trim(ElementOBJ)<>"" Then
37
Set Element=XmlDom.selectSingleNode("//"&Trim(ElementOBJ))
38
If Lcase(Element.nodeTypeString)="attribute" Then Set Element=Element.selectSingleNode("..")
39
End If
40
ElseIf IsObject(ElementOBJ) Then
41
Set Element=ElementOBJ
42
End If
43
44
If Element Is Nothing Then
45
Set ChildNode=XmlDom.selectSingleNode("//"&Trim(ChildNodeObj))
46
ElseIf IsAttributeNode=true Then
47
Set ChildNode=Element.selectSingleNode("./@"&Trim(ChildNodeObj))
48
Else
49
Set ChildNode=Element.selectSingleNode("./"&Trim(ChildNodeObj))
50
End If
51
End If
52
End Property
53
54
'读取最后的错误信息
55
Public Property Get ErrInfo
56
ErrInfo=fErrInfo
57
End Property
58
59
'给xml内容
60
Public Property Get xmlText(byVal ElementOBJ)
61
xmlText=""
62
If fopen=false Then Exit Property
63
64
Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
65
If ElementOBJ Is Nothing Then Set ElementOBJ=XmlDom
66
67
xmlText=ElementOBJ.xml
68
End Property
69
70
'=================================================================
71
'类初始化
72
Private Sub Class_Initialize()
73
Set XmlDom=CreateObject("Microsoft.XMLDOM")
74
XmlDom.preserveWhiteSpace=true
75
76
Set fNode=Nothing
77
Set fANode=Nothing
78
79
fErrInfo=""
80
fFileName=""
81
fopen=false
82
End Sub
83
84
'类释放
85
Private Sub Class_Terminate()
86
Set fNode=Nothing
87
Set fANode=Nothing
88
Set XmlDom=nothing
89
fopen=false
90
End Sub
91
92
'=====================================================================
93
'建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址
94
'返回根结点
95
Function Create(byVal RootElementName,byVal XslUrl)
96
Dim PINode,RootElement
97
98
Set Create=Nothing
99
100
If (XmlDom Is Nothing) Or (fopen=true) Then Exit Function
101
102
If Trim(RootElementName)="" Then RootElementName="Root"
103
104
Set PINode=XmlDom.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""GB2312""")
105
XmlDom.appendChild PINode
106
107
Set PINode=XMLDOM.CreateProcessingInstruction("xml-stylesheet", "type=""text/xsl"" href="""&XslUrl&"""")
108
XmlDom.appendChild PINode
109
110
Set RootElement=XmlDom.createElement(Trim(RootElementName))
111
XmlDom.appendChild RootElement
112
113
Set Create=RootElement
114
115
fopen=True
116
set fNode=RootElement
117
End Function
118
119
'开打一个已经存在的XML文件,返回打开状态
120
Function Open(byVal xmlSourceFile)
121
Open=false
122
123
xmlSourceFile=Trim(xmlSourceFile)
124
If xmlSourceFile="" Then Exit Function
125
126
XmlDom.async = false
127
XmlDom.load xmlSourceFile
128
129
fFileName=xmlSourceFile
130
131
If not IsError Then
132
Open=true
133
fopen=true
134
End If
135
End Function
136
137
'关闭
138
Sub Close()
139
Set fNode=Nothing
140
Set fANode=Nothing
141
142
fErrInfo=""
143
fFileName=""
144
fopen=false
145
End Sub
146
147
'读取一个NodeOBJ的节点Text的值
148
'NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode
149
Function getNodeText(byVal NodeOBJ)
150
getNodeText=""
151
If fopen=false Then Exit Function
152
153
Set NodeOBJ=ChildNode(null,NodeOBJ,false)
154
If NodeOBJ Is Nothing Then Exit Function
155
156
If Lcase(NodeOBJ.nodeTypeString)="element" Then
157
set fNode=NodeOBJ
158
Else
159
set fANode=NodeOBJ
160
End If
161
getNodeText=NodeOBJ.text
162
End function
163
164
'插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。
165
'IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型
166
'插入成功就返回新插入这个节点
167
'BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象
168
Function InsertElement(byVal BefelementOBJ,byVal ElementName,byVal ElementText,byVal IsFirst,byVal IsCDATA)
169
Dim Element,TextSection,SpaceStr
170
Set InsertElement=Nothing
171
172
If not fopen Then Exit Function
173
174
Set BefelementOBJ=ChildNode(XmlDom,BefelementOBJ,false)
175
If BefelementOBJ Is Nothing Then Exit Function
176
177
Set Element=XmlDom.CreateElement(Trim(ElementName))
178
179
'SpaceStr=vbCrLf&TabStr(BefelementOBJ)
180
'Set STabStr=XmlDom.CreateTextNode(SpaceStr)
181
182
'If Len(SpaceStr)>2 Then SpaceStr=Left(SpaceStr,Len(SpaceStr)-2)
183
'Set ETabStr=XmlDom.CreateTextNode(SpaceStr)
184
185
If IsFirst=true Then
186
'BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild
187
BefelementOBJ.InsertBefore Element,BefelementOBJ.firstchild
188
'BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild
189
Else
190
'BefelementOBJ.appendChild STabStr
191
BefelementOBJ.appendChild Element
192
'BefelementOBJ.appendChild ETabStr
193
End If
194
195
If IsCDATA=true Then
196
set TextSection=XmlDom.createCDATASection(ElementText)
197
Element.appendChild TextSection
198
ElseIf ElementText<>"" Then
199
Element.Text=ElementText
200
End If
201
202
Set InsertElement=Element
203
Set fNode=Element
204
End Function
205
206
'在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性
207
'如果已经存在名为AttributeName的属性对象,就进行修改。
208
'返回插入或修改属性的Node
209
'ElementOBJ可以是Element对象或名,为null就取当前默认对象
210
Function setAttributeNode(byVal ElementOBJ,byVal AttributeName,byVal AttributeText)
211
Dim AttributeNode
212
Set setAttributeNode=nothing
213
214
If not fopen Then Exit Function
215
216
Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
217
If ElementOBJ Is Nothing Then Exit Function
218
219
Set AttributeNode=ElementOBJ.attributes.getNamedItem(AttributeName)
220
If AttributeNode Is nothing Then
221
Set AttributeNode=XmlDom.CreateAttribute(AttributeName)
222
ElementOBJ.setAttributeNode AttributeNode
223
End If
224
AttributeNode.text=AttributeText
225
226
set fNode=ElementOBJ
227
set fANode=AttributeNode
228
Set setAttributeNode=AttributeNode
229
End Function
230
231
'修改ElementOBJ节点的Text值,并返回这个节点
232
'ElementOBJ可以对象或对象名,为null就取当前默认对象
233
Function UpdateNodeText(byVal ElementOBJ,byVal NewElementText,byVal IsCDATA)
234
Dim TextSection
235
236
set UpdateNodeText=nothing
237
If not fopen Then Exit Function
238
239
Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
240
If ElementOBJ Is Nothing Then Exit Function
241
242
If IsCDATA=true Then
243
set TextSection=XmlDom.createCDATASection(NewElementText)
244
If ElementOBJ.firstchild Is Nothing Then
245
ElementOBJ.appendChild TextSection
246
ElseIf LCase(ElementOBJ.firstchild.nodeTypeString)="cdatasection" Then
247
ElementOBJ.replaceChild TextSection,ElementOBJ.firstchild
248
End If
249
Else
250
ElementOBJ.Text=NewElementText
251
End If
252
253
set fNode=ElementOBJ
254
Set UpdateNodeText=ElementOBJ
255
End Function
256
257
'返回符合testValue条件的第一个ElementNode,为null就取当前默认对象
258
Function getElementNode(byVal ElementName,byVal testValue)
259
Dim Element,regEx,baseName
260
261
Set getElementNode=nothing
262
If not fopen Then Exit Function
263
264
testValue=Trim(testValue)
265
Set regEx=New RegExp
266
regEx.Pattern="^[A-Za-z]+"
267
regEx.IgnoreCase=true
268
If regEx.Test(testValue) Then testValue="/"&testValue
269
Set regEx=nothing
270
271
baseName=LCase(Right(ElementName,Len(ElementName)-InStrRev(ElementName,"/",-1)))
272
273
Set Element=XmlDom.SelectSingleNode("//"&ElementName&testValue)
274
275
If Element Is Nothing Then
276
'Response.write ElementName&testValue
277
Set getElementNode=nothing
278
Exit Function
279
End If
280
281
Do While LCase(Element.baseName)<>baseName
282
Set Element=Element.selectSingleNode("..")
283
If Element Is Nothing Then Exit Do
284
Loop
285
286
If LCase(Element.baseName)<>baseName Then
287
Set getElementNode=nothing
288
Else
289
Set getElementNode=Element
290
If Lcase(Element.nodeTypeString)="element" Then
291
Set fNode=Element
292
Else
293
Set fANode=Element
294
End If
295
End If
296
End Function
297
298
'删除一个子节点
299
Function removeChild(byVal ElementOBJ)
300
removeChild=false
301
If not fopen Then Exit Function
302
303
Set ElementOBJ=ChildNode(null,ElementOBJ,false)
304
If ElementOBJ Is Nothing Then Exit Function
305
306
'response.write ElementOBJ.baseName
307
308
If Lcase(ElementOBJ.nodeTypeString)="element" Then
309
If ElementOBJ Is fNode Then set fNode=Nothing
310
If ElementOBJ.parentNode Is Nothing Then
311
XmlDom.removeChild(ElementOBJ)
312
Else
313
ElementOBJ.parentNode.removeChild(ElementOBJ)
314
End If
315
removeChild=True
316
End If
317
End Function
318
319
'清空一个节点所有子节点
320
Function ClearNode(byVal ElementOBJ)
321
set ClearNode=Nothing
322
If not fopen Then Exit Function
323
324
Set ElementOBJ=ChildNode(null,ElementOBJ,false)
325
If ElementOBJ Is Nothing Then Exit Function
326
327
ElementOBJ.text=""
328
ElementOBJ.removeChild(ElementOBJ.firstchild)
329
330
Set ClearNode=ElementOBJ
331
Set fNode=ElementOBJ
332
End Function
333
334
'删除子节点的一个属性
335
Function removeAttributeNode(byVal ElementOBJ,byVal AttributeOBJ)
336
removeAttributeNode=false
337
If not fopen Then Exit Function
338
339
Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
340
If ElementOBJ Is Nothing Then Exit Function
341
342
Set AttributeOBJ=ChildNode(ElementOBJ,AttributeOBJ,true)
343
If not AttributeOBJ Is nothing Then
344
ElementOBJ.removeAttributeNode(AttributeOBJ)
345
removeAttributeNode=True
346
End If
347
End Function
348
349
'保存打开过的文件,只要保证FileName不为空就可以实现保存
350
Function Save()
351
On Error Resume Next
352
Save=false
353
If (not fopen) or (fFileName="") Then Exit Function
354
355
XmlDom.Save fFileName
356
Save=(not IsError)
357
If Err.number<>0 then
358
Err.clear
359
Save=false
360
End If
361
End Function
362
363
'另存为XML文件,只要保证FileName不为空就可以实现保存
364
Function SaveAs(SaveFileName)
365
On Error Resume Next
366
SaveAs=false
367
If (not fopen) or SaveFileName="" Then Exit Function
368
XmlDom.Save SaveFileName
369
SaveAs=(not IsError)
370
If Err.number<>0 then
371
Err.clear
372
SaveAs=false
373
End If
374
End Function
375
376
'检查并打印错误信息
377
Private Function IsError()
378
If XmlDom.ParseError.errorcode<>0 Then
379
fErrInfo="<h1>Error"&XmlDom.ParseError.errorcode&"</h1>"
380
fErrInfo=fErrInfo&"<B>Reason :</B>"&XmlDom.ParseError.reason&"<br>"
381
fErrInfo=fErrInfo&"<B>URL :</B>"&XmlDom.ParseError.url&"<br>"
382
fErrInfo=fErrInfo&"<B>Line :</B>"&XmlDom.ParseError.line&"<br>"
383
fErrInfo=fErrInfo&"<B>FilePos:</B>"&XmlDom.ParseError.filepos&"<br>"
384
fErrInfo=fErrInfo&"<B>srcText:</B>"&XmlDom.ParseError.srcText&"<br>"
385
IsError=True
386
Else
387
IsError=False
388
End If
389
End Function
390
End Class
391
%>
392