タグ: VB.net XML DOM

Xmlを作成し、ノードを追加する

サンプルコード

Imports System.Xml

Sub Main()
  Dim doc As New XmlDocument()
  'XML宣言の作成
  Dim Dec As XmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
  doc.AppendChild(Dec)
  'doc.AppendChild(doc.CreateXmlDeclaration("1.0", "UTF-8", Nothing))とまとめて書く事もできる
 
  'ルートノードを追加
  Dim root As XmlElement = doc.CreateElement("root")
  doc.AppendChild(root)
 
  'とりあえずエレメントを追加
  Dim Item1 As XmlElement = doc.CreateElement("Item1")
  Dim attr1 As XmlAttribute = doc.CreateAttribute("attr")
  Dim Item1Text As XmlText = doc.CreateTextNode("普通の方法で追加")
 
  attr1.Value = "普通の方法で属性追加"
  Item1.Attributes.Append(attr1)
  Item1.AppendChild(Item1Text)
  root.AppendChild(Item1)
 
  'さらに子エレメントを追加
  Dim Item1Child As XmlElement = doc.CreateElement("childItem")
  Item1Child.InnerText = "ちょっと無精して追加"
  Item1.AppendChild(Item1Child)
 
  '属性を簡単に追加
  Dim Item2 As XmlElement = doc.CreateElement("Item2")
  Item2.SetAttribute("attr", "一緒に作成")
  root.AppendChild(Item2)
 
  '任意の位置に追加
  Dim Item3 As XmlElement = doc.CreateElement("Item3")
  Item3.SetAttribute("attr", "Item2の前に追加")
  root.InsertBefore(Item3, Item2)

  Dim Item4 As XmlElement = doc.CreateElement("Item4")
  Item4.SetAttribute("attr", "Item3の後ろに追加")
  root.InsertAfter(Item4, Item3)

  'コメントを追加
  Dim comment As XmlComment = doc.CreateComment("これがコメントです")
  root.AppendChild(comment)

  '文字列でいきなり追加する
  root.InnerXml &= _
  "<Item5 attr=""スーパー省略で追加="""">
    <ChildItem>"省略しました</ChildItem>
   </Item5>"
 
  '最後に保存
  doc.Save("C:\test.xml")
 
End Sub
------------------出力結果----------------------
<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <Item1 attr="普通の方法で属性追加">
  普通の方法で追加
  <childItem>ちょっと無精して追加</childItem>
  </Item1>
  <Item4 attr="Item1の後ろに追加" />
  <Item3 attr="Item2の前に追加" />
  <Item2 attr="一緒に作成" />
  <!-- これがコメントです-->
  <Item5 attr="スーパー省略で追加">
    <ChildItem>省略しました</ChildItem>
  </Item5>
</root>

基本的には "ノードの作成→作成したノードの値の設定→追加したいノードの子ノードに追加" の流れです。

CreateXmlDeclarationの第一引数は今のところ必ず"1.0"です。他の値だとエラーします。

属性の追加はXmlAttributeのインスタンスを作成して、エレメントに追加する方法もありますが、SetAttributeメゾットでも同じなのでここでは省略します。

任意の位置にエレメントを追加するには、InsertBeforeもしくはInsertAfterメゾットを使用します。第一引数に追加するエレメント、第二引数に基準となるエレメントを指定します。

最後に保存するわけなのですが、これがすごく便利で、何かしらのツールでXMLを作成するとブラウザでは普通に見れるのに、メモ帳なんかで開くと一列になっていて見にくいとかいう時に、XMLを読み込ませて何にもせずに保存するだけでメモ帳で開いても体裁の整った状態で見る事ができます。


文字列からXMLを作成する

サンプルコード

Imports System.Xml

Sub Main()
  Dim contents As String =""
  contents &= "<?xml version=""1.0"" encoding=""UTF-8""?>"
  contents &= "<data>"
  contents &=   "<Writer sex=""men="">鈴木一郎"
  contents &=     "<book>XML入門</book>"
  contents &=     "<price>1200</price>"
  contents &=     "<Sales>"
  contents &=       "<store code=""001="">100</store>"
  contents &=       "<store code=""002="">150</store>"
  contents &=       "<store code=""003="">NoHand</store>"
  contents &=       "<store code=""004="">300</store>"
  contents &=     "</Sales>"
  contents &=   "</Writer>"
  contents &= "</data>"
  Dim doc As New XmlDocument
  Dim item As XmlElement
  doc.LoadXml(contents)
End Sub

普通に文字列でXMLを書き込んで、それをLoadXML関数で読み込ませるだけです。


NameSpaceのあるXMLを作成する

サンプルコード

Imports System.Xml

Sub Main()
  Dim xmlDoc = New XmlDocument()
  Dim xmlDec As XmlDeclaration = _
    xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
  xmlDoc.AppendChild(xmlDec)
  Dim rootNode As XmlElement = _
    xmlDoc.CreateElement("root", "http://www.sitemaps.org/schemas/sitemap/0.9")
  Dim childNode As XmlElement = xmlDoc.CreateElement("child", "") '*a
  rootNode.AppendChild(childNode)
  xmlDoc.AppendChild(rootNode)

End Sub

エレメントを作成する時に第二引数に文字列でURLを指定してあげるだけです。少し注意が必要なのは[*a]にもあるように、子ノードにはNamespaceを付与したくない場合は何も指定しないのではなく、からのURLを指定してあげる必要があります。