いまさら聞けないXML〜VB.netでXMLを書き出す

  • 2011.08.27 Saturday
  • 21:02

 

古い記事なので、

XmlDataDocument

というクラスを使っていますが、

XmlDocument

クラスに読み替えていただければ警告がなくなります。

 

 

投稿としては、XMLを読み出すシリアライズの前に書いておいた方が良かったかもしれない。

今回は、シリアライズしてXMLに書き込むのではなく、
たとえて言うなら、設定ファイル(iniファイル)でよく使われる
WritePrivateProfileStringのような感じで書き込んでいく方法を覚え書きしてみる

もっと効率のよい書き方があるかもしれません。
覚え書きなので、許してちょ


■XMLファイルを新規作成する
土台となるXMLファイルを作る方法
 

Dim xEncode As Encoding = Encoding.GetEncoding(65001I) 'エンコード65001がUTF8
Dim xDocument As XmlDataDocument = New XmlDataDocument  'XMLドキュメント作成
Dim xDeclaration As XmlDeclaration = xDocument.CreateXmlDeclaration("1.0", xEncode.BodyName, Nothing'ヘッダ(?)部作成
Dim xRoot As XmlElement = xDocument.CreateElement("ルート名")   'ルート部作成
‌ 
Call xDocument.AppendChild(xDeclaration)   'ドキュメントにヘッダを追加
Call xDocument.AppendChild(xRoot)    'ドキュメントにルートを追加
‌ 
Call xDocument.Save("ファイル名"'保存(書き出し)


※System.Xml、System.Textなどのインポートが必要


◆出力例

<?xml version="1.0" encoding="utf-8"?>
<xRoot />


ルート名(親要素)をxRootとした場合


保存したファイルは読み込みでも書いた
 

Call xDocument.Load("ファイル名")


で読み込める


■ルート(親要素)に新しい要素(子要素)を作る
 

Dim newNode As XmlElement = xDocument.CreateElement("子要素名")
Call xRoot.AppendChild(newNode) 'ルートへ子要素を追加

 


◆出力結果
 

 

<?xml version="1.0" encoding="utf-8"?>
<xRoot>
  <xData />
</xRoot>


※子要素名をxDataとした場合
 

■新しい要素の中に属性を入れる

「新しい要素(子要素)を作る」に
 

Call newNode.SetAttribute("属性名", "属性値")


を加える
 

Dim newNode As XmlElement = xDocument.CreateElement("子要素名")
Call newNode.SetAttribute("属性名", "属性値")  '属性の設定

 


◆出力結果
 

 

<?xml version="1.0" encoding="utf-8"?>
<xRoot>
  <xData dID="都道府県" />
</xRoot>


※属性名をdID、属性値を 都道府県 とした場合
 
■要素の中に値を入れる

「新しい要素(子要素)を作る」に
 

Dim xValue As XmlText = xDocument.CreateTextNode("値")
Call newNode.AppendChild(xValue)


を加える
 

Dim newNode As XmlElement = xDocument.CreateElement("子要素名")
Dim xValue As XmlText = xDocument.CreateTextNode("値"'値を作成
Call newNode.AppendChild(xValue) '値を代入

 


◆出力結果
 

 

<?xml version="1.0" encoding="utf-8"?>
<xRoot>
  <xData>都道府県</xData>
</xRoot>


※値に 都道府県 を代入した場合

■新しい要素の中に孫要素を入れる

要素は値と同じなので、
xValue(XmlTextクラス)をnewChild(XmlElementクラス)に変えることで、
孫要素を追加できる。
 

Dim newNode As XmlElement = xDocument.CreateElement("子要素名")
Dim newChild As XmlElement = xDocument.CreateElement("孫要素名"'孫要素作成
Call newNode.AppendChild(newChild) '孫要素を追加

 


◆出力結果
 

 

<?xml version="1.0" encoding="utf-8"?>
<xRoot>
  <xData>
    <xFuken />
  </xData>
</xRoot>

 

 


◆ソース例

上の書き込み方法を使って、
いまさら聞けないXML〜VB.netでXMLを読むのデータ例を作ってみる。
 

 

 

Dim xEncode As Encoding = Encoding.GetEncoding(65001I) '65001がUTF8
Dim xDocument As XmlDataDocument = New XmlDataDocument  'XMLドキュメント作成
Dim xDeclaration As XmlDeclaration = xDocument.CreateXmlDeclaration("1.0", xEncode.BodyName, Nothing'ヘッダ部作成
Dim xRoot As XmlElement = xDocument.CreateElement("xRoot")   'ルート部
‌ 
Dim xFuken As XmlElement '府県
Dim xItem As XmlElement '府県アイテム
Dim xValue As XmlText '値
‌ 
'データ要素を作る
Dim newData As XmlElement = xDocument.CreateElement("xData"'要素を作成
Call newData.SetAttribute("dID", "都道府県"'属性の設定
‌ 
'府県要素を作る
xFuken = xDocument.CreateElement("xFuken"'要素を作成
‌ 
Call xFuken.SetAttribute("kID", "A1"'属性の設定
‌ 
'府県要素に値を追加する
xItem = xDocument.CreateElement("xCode"'要素を作成
xValue = xDocument.CreateTextNode("T1"'値を作成
‌ 
Call xItem.AppendChild(xValue) '値を代入
Call xFuken.AppendChild(xItem) '要素を代入
‌ 
xItem = xDocument.CreateElement("xName"'要素を作成
xValue = xDocument.CreateTextNode("東京"'値を作成
‌ 
Call xItem.AppendChild(xValue) '値を代入
Call xFuken.AppendChild(xItem) '要素を代入
‌ 
Call newData.AppendChild(xFuken) '孫要素を追加
Call xRoot.AppendChild(newData) 'ルートへ追加
‌ 
Call xDocument.AppendChild(xDeclaration)   'ドキュメントにヘッダを追加
Call xDocument.AppendChild(xRoot)    'ドキュメントにルートを追加
‌ 
Call xDocument.Save(xFile) '保存
‌ 
xDeclaration = Nothing
xRoot = Nothing
xDocument = Nothing
xEncode = Nothing
‌ 
xDocument = New XmlDataDocument
‌ 
Call xDocument.Load(xFile)
‌ 
xRoot = xDocument.DocumentElement    'ルートタグの設定

 


■出力例
このソースだけでは
 

 

<?xml version="1.0" encoding="utf-8"?>
<xRoot>
    <xData dID="都道府県">
        <xFuken kID="A1">
            <xCode>T1</xCode>
            <xName>東京</xName>
        </xFuken>
    </xData>
</xRoot>

 


だけが保存される。
データ例のように、大阪要素、福岡要素を追加する場合は、
東京要素と同様の処理を繰り返せばよい



この読み書きをうまく組み合わせてプログラミングすれば、
iniファイルのようなXML設定ファイルを作ることができる。

要素や値が入っていないときなど、nothingが返ってきたりする処理を
エラーなくプログラミングするかが結構難しいが、なれれば簡単。
 


追記

.Net4xになって、

上のサンプルを書くと

 

BC40000    'XmlDataDocument' は廃止されています: 'XmlDataDocument class will be removed in a future release.'

 

という警告が出る。

 

XmlDataDocument を XmlDocument に変えれば警告はなくなると思う。

 

 




■参考
HIRO's.NET
http://hiros-dot.net/VBNET2005/XMLMenu.htm

関連投稿
いまさら聞けないXML〜VB.netでXMLを読む

いまさら聞けないXML〜VB.netでXMLをシリアライズして保存してみる
いまさら聞けないXML〜VB.netでXMLをデシリアライズしてXMLを読む

いまさら聞けないXML〜VB.netでXMLをシリアライズしてテキスト(文字列)にしてみる

いまさら聞けないXML〜AppendChildの書き込み速度が遅くなる?
今さら聞けないXML〜Shadowsとシリアライズ編
いまさら聞けないXML〜パラメーターをもたないNewを作る
いまさら聞けないXML〜名前空間マネージャ


いまさらJSONしてみる〜VB2008でJSON形式を使う
いまさらJSONしてみる〜クラスや構造体をJSONしてみる
いまさらJSONしてみる〜配列を作ってみる。
いまさらJSONしてみる〜難読化とクラスのデシリアライズ
オブジェクト型をどうにかキャストしてみる〜objectな配列を取り出す

いまさらJSONしてみる〜System.Text.JSONを使う

 

コメント
参考にさせていただいております
ありがとうございます
実は 全くの素人でただひたすらコピーして動く事を確認しているような 状態です
今「いまさら聞けないXML〜VB.netでXMLを書き出す」を
コピーしているのですが「xFile」の宣言がなく 動きません
どの様に設定したらよろしいのでしょうか
お忙しいとは思いますがよろしくお願いいたします
  • 吉田 仁
  • 2015/01/19 6:31 PM
吉田さま
参考にしていただき、ありがとうございます。

さて、だいぶ端折っておりますので、宣言のないところもある(暗黙で)かと思いますが、
まずは、最初から読んでいただきながら(特に先頭の「XMLファイルを新規作成する」部分)、
対象のメソッドをMSDNで検索していただければ(下記リンク)、何が入るか分かるかなと思います。

ヒントは
xFile="ファイル名"
です。

MSDNリファレンス
saveメソッド
http://msdn.microsoft.com/ja-jp/library/dw229a22%28v=vs.90%29.aspx
loadメソッド
http://msdn.microsoft.com/ja-jp/library/b15d53d6%28v=vs.90%29.aspx

DOBON.NETも参考になるかと思います。
http://dobon.net/vb/dotnet/programing/editappconfigfile.html

答えっぽい投稿
http://blog.syo-ko.com/?eid=1222

素人を卒業するために、
もうちょっと考えてみて、答えを見つけてみてくださいm(_ _)m
  • rockecco
  • 2015/01/19 10:11 PM
コメントする








    

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2024 >>

search this site.

よく使う、検索される投稿

categories

■Google AD■

アマゾン

楽天

その他

selected entries

archives

recent comment

  • エクセルの新しいウインドウを開いたら、〜.xlsx - 2 しか表示されなくなった。
    rockecco (02/19)
  • エクセルの新しいウインドウを開いたら、〜.xlsx - 2 しか表示されなくなった。
    AG (02/19)
  • エクセルの新しいウインドウを開いたら、〜.xlsx - 2 しか表示されなくなった。
    rockecco (01/27)
  • エクセルの新しいウインドウを開いたら、〜.xlsx - 2 しか表示されなくなった。
    猫野親分 (01/09)
  • USBデバイスの取り外しができない
    rockecco (11/26)
  • さっそく壊しました〜ミッキーマウス ウェスタンロコモーティブ
    rockecco (11/25)
  • さっそく壊しました〜ミッキーマウス ウェスタンロコモーティブ
    bata (11/23)
  • USBデバイスの取り外しができない
    michikusa (10/18)
  • さっそく壊しました〜ミッキーマウス ウェスタンロコモーティブ
    rockecco (09/28)
  • さっそく壊しました〜ミッキーマウス ウェスタンロコモーティブ
    はるママ (09/28)

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM