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
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
[443]30 attributes As XmlAttributeCollection
[402]31 childNodes As XmlNodeList
[424]32 prefix As String
33 localName As String
34 namespaceURI As String
35 ownerDocument As XmlDocument
36 value As String
[442]37 nodeType As XmlNodeType
[402]38
[424]39Public
40
[402]41 /*!
[424]42 @brief コンストラクタ
43 */
[442]44 Sub XmlNode( nodeType As XmlNodeType, prefix As String, localName As String, namespaceURI As String, doc As XmlDocument )
[451]45 This.nodeType = nodeType
[424]46 This.prefix = prefix
47 This.localName = localName
48 This.namespaceURI = namespaceURI
49 This.ownerDocument = doc
50 This.value = Nothing
51
[443]52 attributes = New XmlAttributeCollection
[424]53 childNodes = New XmlNodeList()
54 End Sub
55
56 /*!
57 @brief コンストラクタ
58 */
[442]59 Sub XmlNode( nodeType As XmlNodeType, data As String, doc As XmlDocument )
[451]60 This.nodeType = nodeType
[424]61 This.prefix = Nothing
62 This.localName = Nothing
63 This.namespaceURI = Nothing
64 This.ownerDocument = doc
65 This.value = data
66
[443]67 attributes = New XmlAttributeCollection
[424]68 childNodes = Nothing
69 End Sub
70
71
72 '----------------------------------------------------------------
73 ' パブリック プロパティ
74 '----------------------------------------------------------------
75
76 /*!
[402]77 @brief 名前またはインデックスによってアクセスできる属性のコレクションを表します。
78 */
[443]79 Virtual Function Attributes() As XmlAttributeCollection
80 Return attributes
81 End Function
[402]82
83 /*!
84 @brief 子ノードリストを返します。
85 */
[424]86 Virtual Function ChildNodes() As XmlNodeList
[402]87 Return childNodes
88 End Function
89
90 /*!
91 @brief ノードの最初の子を取得します。
92 */
[424]93 Virtual Function FirstChild() As XmlNode
[402]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 */
[424]104 Virtual Function HasChildNodes() As Boolean
[402]105 Return Not ( childNodes.Count = 0 )
106 End Function
107
108 /*!
[424]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 /*!
[442]132 @brief このノードのノードタイプを取得します。
133 @return このノードのノードタイプ。
134 */
135 Virtual Function NodeType() As XmlNodeType
136 return nodeType
137 End Function
138
139 /*!
[424]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
[443]163 /*!
164 @brief このノードの値を取得します。
165 @return このノードの値。
166 */
167 Virtual Function Value() As String
168 return value
169 End Function
[424]170
[443]171 /*!
172 @brief このノードの値を設定します。
173 @param value 値文字列。
174 */
175 Virtual Sub Value( value As String )
176 This.value = value
177 End Sub
[424]178
[443]179
[424]180 '----------------------------------------------------------------
181 ' パブリック メソッド
182 '----------------------------------------------------------------
183
184 /*!
[402]185 @brief このノードの子ノードリストの末尾に指定したノードを追加する。
186 */
[424]187 Virtual Function AppendChild( newChild As XmlNode ) As XmlNode
188 childNodes.Add( newChild )
189 Return newChild
[402]190 End Function
191
192 /*!
193 @brief ノードを複製する。
194 */
[424]195 Virtual Function Clone() As XmlNode
[402]196 ' TODO: 実装
197 End Function
198
199 /*!
200 @brief 派生クラスでオーバーライドされた場合は、ノードの複製を作成する。
201 */
[424]202 Virtual Function CloneNode( deep As Boolean ) As XmlNode
[402]203 ' TODO: 実装
204 End Function
205
206 /*!
207 @brief XmlNode のノードに対する Foreachスタイルの反復をサポートします。
208 */
[424]209 Virtual Function GetEnumerator() As IEnumerator
[402]210 ' TODO: 実装
211 End Function
212
213 /*!
214 @brief 指定したノードを指定した参照ノードの直後に挿入します。
215 @param newChild 挿入するXmlNode。
216 refChild 参照ノードであるXmlNode。newNode は、refNode の後に配置されます。
217 @return 挿入されるノード。
218 */
[424]219 Virtual Function InsertAfter( newChild As XmlNode, refChild As XmlNode ) As XmlNode
[402]220 ' TODO: 実装
221 End Function
222
223 /*!
224 @brief 指定したノードを指定した参照ノードの直前に挿入します。
225 @param newChild 挿入するXmlNode。
226 refChild 参照ノードであるXmlNode。newNode は、refNode の前に配置されます。
227 @return 挿入されるノード。
228 */
[424]229 Virtual Function InsertBefore( newChild As XmlNode, refChild As XmlNode ) As XmlNode
[402]230 ' TODO: 実装
231 End Function
232
233 /*!
234 @brief このノードの子ノードのリストの先頭に、指定したノードを追加します。
235 @param newChild 挿入するXmlNode。
236 @return 挿入されるノード。
237 */
[424]238 Virtual Function PrependChild( newChild As XmlNode ) As XmlNode
[402]239 ' TODO: 実装
240 End Function
241
242 /*!
243 @brief 現在のノードのすべての子ノードと属性の両方、またはそのいずれかを削除します。
244 */
[424]245 Virtual Sub RemoveAll()
[455]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
[402]252 End Sub
253
254 /*!
[454]255 @brief 現在のノードのすべての子ノードを削除します。
[455]256 @param oldChild 削除するXmlNode。
[402]257 @return 削除されたノード。
258 */
[424]259 Virtual Function RemoveChild( oldChild As XmlNode ) As XmlNode
[455]260 childNodes.Remove( oldChild )
[402]261 End Function
262
263 /*!
264 @brief 子ノード oldChild を newChild ノードに置き換えます。
265 @param newChild 新しいノード。
266 oldChild 置換されノード。
267 @return 置き換えられたノード。
268 */
[424]269 Virtual Function ReplaceChild( newChild As XmlNode, oldChild As XmlNode ) As XmlNode
[402]270 ' TODO: 実装
271 End Function
272
[442]273
274Protected
[443]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
[442]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
[451]313 If This.childNodes.Count = 0 Then
[443]314 Return indentStr + "<" + localName + This.GetAttributesStr() + " />" + crlfStr
[442]315 End If
316
317 Dim result = ""
318
[451]319 If This.FirstChild.NodeType = XmlNodeType.Text Then
320 ' 子ノードがテキストのときは開始タグ、終了タグの間にインデントや改行を入れない
[442]321
[451]322 ' 開始タグ
323 result += indentStr + "<" + localName + This.GetAttributesStr() + ">"
[442]324
[451]325 ' 子ノードリスト
326 result += InnerXmlSupportedIndent( isIndent, indent + 1 )
[442]327
[451]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
[442]341 Return result
342 End Function
[402]343End Class
344
[424]345TypeDef XmlNodeList = System.Collections.Generic.List<XmlNode>
[402]346
[424]347
[402]348End Namespace
349End Namespace
Note: See TracBrowser for help on using the repository browser.