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

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

タグ属性に対応。

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