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

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

RemoveAll/RemoveChildメソッドを修正。

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