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

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

RemoveAll/RemoveChildメソッドを実装。

File size: 8.2 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 attributes = Nothing
247 childNodes = Nothing
248 End Sub
249
250 /*!
251 @brief 現在のノードのすべての子ノードを削除します。
252 @param newChild 削除するXmlNode。
253 @return 削除されたノード。
254 */
255 Virtual Function RemoveChild( oldChild As XmlNode ) As XmlNode
256 childNodes = Nothing
257 End Function
258
259 /*!
260 @brief 子ノード oldChild を newChild ノードに置き換えます。
261 @param newChild 新しいノード。
262 oldChild 置換されノード。
263 @return 置き換えられたノード。
264 */
265 Virtual Function ReplaceChild( newChild As XmlNode, oldChild As XmlNode ) As XmlNode
266 ' TODO: 実装
267 End Function
268
269
270Protected
271
272 Function GetAttributesStr() As String
273 If attributes.Count = 0 Then
274 ' 属性が1つもない場合
275 Return ""
276 End If
277
278 Dim result = ""
279 Foreach attribute In attributes
280 result += " " + attribute.OuterXml
281 Next
282 Return result
283 End Function
284
285 Virtual Function InnerXmlSupportedIndent( isIndent = False As Boolean, indent = 0 As Long ) As String
286 Dim result = ""
287 If Not ActiveBasic.IsNothing( childNodes ) Then
288 ' 子ノード
289 Foreach childNode In childNodes
290 result += childNode.OwnerXmlSupportedIndent( isIndent, indent )
291 Next
292 End If
293 Return result
294 End Function
295
296 Virtual Function OwnerXmlSupportedIndent( isIndent = False As Boolean, indent = 0 As Long ) As String
297 Dim indentStr = ""
298 Dim crlfStr = ""
299 If isIndent Then
300 ' インデントをサポートする場合
301 Dim i As Long
302 For i=0 To ELM(indent)
303 indentStr += Ex"\t"
304 Next
305
306 crlfStr = Ex"\r\n"
307 End If
308
309 If This.childNodes.Count = 0 Then
310 Return indentStr + "<" + localName + This.GetAttributesStr() + " />" + crlfStr
311 End If
312
313 Dim result = ""
314
315 If This.FirstChild.NodeType = XmlNodeType.Text Then
316 ' 子ノードがテキストのときは開始タグ、終了タグの間にインデントや改行を入れない
317
318 ' 開始タグ
319 result += indentStr + "<" + localName + This.GetAttributesStr() + ">"
320
321 ' 子ノードリスト
322 result += InnerXmlSupportedIndent( isIndent, indent + 1 )
323
324 ' 終了タグ
325 result += "</" + localName + ">" + crlfStr
326 Else
327 ' 開始タグ
328 result += indentStr + "<" + localName + This.GetAttributesStr() + ">" + crlfStr
329
330 ' 子ノードリスト
331 result += InnerXmlSupportedIndent( isIndent, indent + 1 )
332
333 ' 終了タグ
334 result += indentStr + "</" + localName + ">" + crlfStr
335 End If
336
337 Return result
338 End Function
339End Class
340
341TypeDef XmlNodeList = System.Collections.Generic.List<XmlNode>
342
343
344End Namespace
345End Namespace
Note: See TracBrowser for help on using the repository browser.