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