source: trunk/Include/Classes/System/Xml/XmlNode.ab@ 475

Last change on this file since 475 was 475, checked in by dai, 16 years ago

XmlSerializer.Deserializeメソッドを実装(仮実装なため、数値メンバのシリアライズのみに留まっている)。
XmlNode.LastChildメソッドを追加。
XmlNode.NextSiblingメソッドを追加。
XmlNode.PreviouseSiblingメソッドを追加。

File size: 9.3 KB
RevLine 
[402]1Namespace System
2Namespace Xml
3
[442]4Enum XmlNodeType
5 None
6 Element
7 Attribute
8 Text
9 CDATA
10 EntifyReference
11 Entity
12 ProcessingInstruction
13 Comment
14 Document
15 DocumentType
16 DocumentFragment
17 Notation
18 Whitespace
19 SignificantWhitespace
20 EndElement
21 EndEntity
22 XmlDeclaration
23End Enum
24
[402]25/*!
26@brief XMLドキュメント内の単一のノードを表す。
27*/
28Class XmlNode
29
[475]30 nodeType As XmlNodeType
[443]31 attributes As XmlAttributeCollection
[402]32 childNodes As XmlNodeList
[424]33 prefix As String
34 localName As String
35 namespaceURI As String
36 ownerDocument As XmlDocument
37 value As String
[475]38 previousSibling As XmlNode
39 nextSibling As XmlNode
[402]40
[424]41Public
42
[402]43 /*!
[424]44 @brief コンストラクタ
45 */
[442]46 Sub XmlNode( nodeType As XmlNodeType, prefix As String, localName As String, namespaceURI As String, doc As XmlDocument )
[451]47 This.nodeType = nodeType
[424]48 This.prefix = prefix
49 This.localName = localName
50 This.namespaceURI = namespaceURI
51 This.ownerDocument = doc
52 This.value = Nothing
[475]53 This.previousSibling = Nothing
54 This.nextSibling = Nothing
[424]55
[443]56 attributes = New XmlAttributeCollection
[424]57 childNodes = New XmlNodeList()
58 End Sub
59
60 /*!
61 @brief コンストラクタ
62 */
[442]63 Sub XmlNode( nodeType As XmlNodeType, data As String, doc As XmlDocument )
[451]64 This.nodeType = nodeType
[424]65 This.prefix = Nothing
66 This.localName = Nothing
67 This.namespaceURI = Nothing
68 This.ownerDocument = doc
69 This.value = data
[475]70 This.previousSibling = Nothing
71 This.nextSibling = Nothing
[424]72
[443]73 attributes = New XmlAttributeCollection
[424]74 childNodes = Nothing
75 End Sub
76
77
78 '----------------------------------------------------------------
79 ' パブリック プロパティ
80 '----------------------------------------------------------------
81
82 /*!
[402]83 @brief 名前またはインデックスによってアクセスできる属性のコレクションを表します。
84 */
[443]85 Virtual Function Attributes() As XmlAttributeCollection
86 Return attributes
87 End Function
[402]88
89 /*!
90 @brief 子ノードリストを返します。
91 */
[424]92 Virtual Function ChildNodes() As XmlNodeList
[402]93 Return childNodes
94 End Function
95
96 /*!
97 @brief ノードの最初の子を取得します。
98 */
[424]99 Virtual Function FirstChild() As XmlNode
[402]100 If childNodes.Count = 0 Then
101 ' 子ノードが1つもないときはNothingを返す
102 Return Nothing
103 End If
104 Return childNodes[0]
105 End Function
106
107 /*!
108 @brief 子ノードが1つ以上あるかどうかを取得します。
109 */
[424]110 Virtual Function HasChildNodes() As Boolean
[402]111 Return Not ( childNodes.Count = 0 )
112 End Function
113
114 /*!
[424]115 @brief このノードの子ノードだけを表すマークアップを取得または設定します。
116 */
117 Virtual Function InnerXml() As String
118 Return InnerXmlSupportedIndent()
119 End Function
120
121 /*!
[475]122 @brief ノードの最後の子を取得します。
123 */
124 Virtual Function LastChild() As XmlNode
125 If childNodes.Count = 0 Then
126 ' 子ノードが1つもないときはNothingを返す
127 Return Nothing
128 End If
129 Return childNodes[childNodes.Count-1]
130 End Function
131
132 /*!
[424]133 @brief ノードのローカル名を取得します。
134 @return ノードのローカル名。
135 */
136 Virtual Function LocalName() As String
137 return localName
138 End Function
139
140 /*!
141 @brief このノードの名前空間 URI を取得します。
142 @return このノードの名前空間 URI。
143 */
144 Virtual Function NamespaceURI() As String
145 return NamespaceURI
146 End Function
147
148 /*!
[475]149 @brief このノードの直後のノードを取得します。
150 @return このノードの直後のノード。
151 */
152 Virtual Function NextSibling() As XmlNode
153 Return nextSibling
154 End Function
155
156 /*!
[442]157 @brief このノードのノードタイプを取得します。
158 @return このノードのノードタイプ。
159 */
160 Virtual Function NodeType() As XmlNodeType
161 return nodeType
162 End Function
163
164 /*!
[424]165 @brief このノードとそのすべての子ノードを表すマークアップを取得します。
166 @return このノードとそのすべての子ノードを格納しているマークアップ。
167 */
168 Virtual Function OuterXml() As String
169 Return OwnerXmlSupportedIndent()
170 End Function
171
172 /*!
173 @brief このノードが属する XmlDocument を取得します。
174 @return このノードが属する XmlDocument。
175 */
176 Virtual Function OwnerDocument() As XmlDocument
177 Return ownerDocument
178 End Function
179
180 /*!
181 @brief このノードの名前空間プリフィックスを取得または設定します。
182 @return このノードの名前空間プリフィックス。たとえば、プリフィックスは要素 <bk:book> の bk です。プリフィックスがない場合、このプロパティは String.Empty を返します。
183 */
184 Virtual Function Prefix() As String
185 return prefix
186 End Function
187
[443]188 /*!
[475]189 @brief このノードの直前のノードを取得します。
190 @return このノードの直前のノード。
191 */
192 Virtual Function PreviousSibling() As XmlNode
193 Return previousSibling
194 End Function
195
196 /*!
[443]197 @brief このノードの値を取得します。
198 @return このノードの値。
199 */
200 Virtual Function Value() As String
201 return value
202 End Function
[424]203
[443]204 /*!
205 @brief このノードの値を設定します。
206 @param value 値文字列。
207 */
208 Virtual Sub Value( value As String )
209 This.value = value
210 End Sub
[424]211
[443]212
[424]213 '----------------------------------------------------------------
214 ' パブリック メソッド
215 '----------------------------------------------------------------
216
217 /*!
[402]218 @brief このノードの子ノードリストの末尾に指定したノードを追加する。
219 */
[424]220 Virtual Function AppendChild( newChild As XmlNode ) As XmlNode
[475]221 Dim lastChild = This.LastChild
[424]222 childNodes.Add( newChild )
[475]223
224 If Not ActiveBasic.IsNothing( lastChild ) Then
225 ' 前後の兄弟要素を指定
226 lastChild.nextSibling = newChild
227 newChild.previousSibling = lastChild
228 End If
229
[424]230 Return newChild
[402]231 End Function
232
233 /*!
234 @brief ノードを複製する。
235 */
[424]236 Virtual Function Clone() As XmlNode
[402]237 ' TODO: 実装
238 End Function
239
240 /*!
241 @brief 派生クラスでオーバーライドされた場合は、ノードの複製を作成する。
242 */
[424]243 Virtual Function CloneNode( deep As Boolean ) As XmlNode
[402]244 ' TODO: 実装
245 End Function
246
247 /*!
248 @brief XmlNode のノードに対する Foreachスタイルの反復をサポートします。
249 */
[424]250 Virtual Function GetEnumerator() As IEnumerator
[402]251 ' TODO: 実装
252 End Function
253
254 /*!
255 @brief 指定したノードを指定した参照ノードの直後に挿入します。
256 @param newChild 挿入するXmlNode。
257 refChild 参照ノードであるXmlNode。newNode は、refNode の後に配置されます。
258 @return 挿入されるノード。
259 */
[424]260 Virtual Function InsertAfter( newChild As XmlNode, refChild As XmlNode ) As XmlNode
[402]261 ' TODO: 実装
262 End Function
263
264 /*!
265 @brief 指定したノードを指定した参照ノードの直前に挿入します。
266 @param newChild 挿入するXmlNode。
267 refChild 参照ノードであるXmlNode。newNode は、refNode の前に配置されます。
268 @return 挿入されるノード。
269 */
[424]270 Virtual Function InsertBefore( newChild As XmlNode, refChild As XmlNode ) As XmlNode
[402]271 ' TODO: 実装
272 End Function
273
274 /*!
275 @brief このノードの子ノードのリストの先頭に、指定したノードを追加します。
276 @param newChild 挿入するXmlNode。
277 @return 挿入されるノード。
278 */
[424]279 Virtual Function PrependChild( newChild As XmlNode ) As XmlNode
[402]280 ' TODO: 実装
281 End Function
282
283 /*!
284 @brief 現在のノードのすべての子ノードと属性の両方、またはそのいずれかを削除します。
285 */
[424]286 Virtual Sub RemoveAll()
[455]287 If Not ActiveBasic.IsNothing( This.attributes ) Then
288 This.attributes.Clear()
289 End If
290 If Not ActiveBasic.IsNothing( This.childNodes ) Then
291 This.childNodes.Clear()
292 End If
[402]293 End Sub
294
295 /*!
[454]296 @brief 現在のノードのすべての子ノードを削除します。
[455]297 @param oldChild 削除するXmlNode。
[402]298 @return 削除されたノード。
299 */
[424]300 Virtual Function RemoveChild( oldChild As XmlNode ) As XmlNode
[455]301 childNodes.Remove( oldChild )
[402]302 End Function
303
304 /*!
305 @brief 子ノード oldChild を newChild ノードに置き換えます。
306 @param newChild 新しいノード。
307 oldChild 置換されノード。
308 @return 置き換えられたノード。
309 */
[424]310 Virtual Function ReplaceChild( newChild As XmlNode, oldChild As XmlNode ) As XmlNode
[402]311 ' TODO: 実装
312 End Function
313
[442]314
315Protected
[443]316
317 Function GetAttributesStr() As String
318 If attributes.Count = 0 Then
319 ' 属性が1つもない場合
320 Return ""
321 End If
322
323 Dim result = ""
324 Foreach attribute In attributes
325 result += " " + attribute.OuterXml
326 Next
327 Return result
328 End Function
329
[442]330 Virtual Function InnerXmlSupportedIndent( isIndent = False As Boolean, indent = 0 As Long ) As String
331 Dim result = ""
332 If Not ActiveBasic.IsNothing( childNodes ) Then
333 ' 子ノード
334 Foreach childNode In childNodes
335 result += childNode.OwnerXmlSupportedIndent( isIndent, indent )
336 Next
337 End If
338 Return result
339 End Function
340
341 Virtual Function OwnerXmlSupportedIndent( isIndent = False As Boolean, indent = 0 As Long ) As String
342 Dim indentStr = ""
343 Dim crlfStr = ""
344 If isIndent Then
345 ' インデントをサポートする場合
346 Dim i As Long
347 For i=0 To ELM(indent)
348 indentStr += Ex"\t"
349 Next
350
351 crlfStr = Ex"\r\n"
352 End If
353
[451]354 If This.childNodes.Count = 0 Then
[443]355 Return indentStr + "<" + localName + This.GetAttributesStr() + " />" + crlfStr
[442]356 End If
357
358 Dim result = ""
359
[451]360 If This.FirstChild.NodeType = XmlNodeType.Text Then
361 ' 子ノードがテキストのときは開始タグ、終了タグの間にインデントや改行を入れない
[442]362
[451]363 ' 開始タグ
364 result += indentStr + "<" + localName + This.GetAttributesStr() + ">"
[442]365
[451]366 ' 子ノードリスト
367 result += InnerXmlSupportedIndent( isIndent, indent + 1 )
[442]368
[451]369 ' 終了タグ
370 result += "</" + localName + ">" + crlfStr
371 Else
372 ' 開始タグ
373 result += indentStr + "<" + localName + This.GetAttributesStr() + ">" + crlfStr
374
375 ' 子ノードリスト
376 result += InnerXmlSupportedIndent( isIndent, indent + 1 )
377
378 ' 終了タグ
379 result += indentStr + "</" + localName + ">" + crlfStr
380 End If
381
[442]382 Return result
383 End Function
[402]384End Class
385
[424]386TypeDef XmlNodeList = System.Collections.Generic.List<XmlNode>
[402]387
[424]388
[402]389End Namespace
390End Namespace
Note: See TracBrowser for help on using the repository browser.