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

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

XmlDocument.Saveメソッドを実装。
Xml文書生成処理を改良。

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