- PR -

XMLファイルの上書きについて

1
投稿者投稿内容
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-03-03 17:07
こんにちは。
VB.NETで開発しているものです。

XMLファイルをDOMに展開して、あるタグの内容を変更します。
そして、そのXMLファイルを上書きしたいと思っているのですが、
下のようなやり方でよいのでしょうか?

Dim xmlDocument As Xml.XmlDocument 'XMLドキュメント
Dim xmlNodeList As Xml.XmlNodeList 'XMLノード

'XML読み込み
 xmlDocument = New Xml.XmlDocument
xmlDocument.Load("C:\AAA.xml")

'XML指定タグ検索
 xmlNodeList = xmlDocument.GetElementsByTagName(pmvTagMes)

'XML書き込み
xmlNodeList(0).InnerText = "テスト"
xmlDocument.Save("C:\AAA.xml")
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-03-03 18:36
るぱんです。
同じくDOMでXML文書を回しています。
環境:
Windows2000
VB6.0
MSXML4.0です。

結論から言うとYESです。

ただ、別の箇所で違和感を覚えました。
戯言と思って頂いても結構です。

getElementsByTagNameを使う事に違和感を覚えます。
selectNodes("//タグ名")と同じ様に見えてしまいます。

後でソースを管理する時非常に厳しくなるので、
XPathをなるべく絶対パスに近い形で明示する方が
後々メンテする人が泣かないですむだろうと思います。

例えば、"."がカレントノードを表すと言う状態なので、
./タグ名1/タグ名2/タグ名3
とか。

途中がめんどくさいけれどDTDがしっかりしている場合は
.//タグ名3
かな?

参考になれば幸です。
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-03-03 18:56
るぱんさん、ありがとうございます。

私のやり方は合っていたのでしたね!

しかし、スキーマチェック(httphttp://www.atmarkit.co.jp/fdotnet/easyxml/easyxml08/easyxml08_01.html)を
行なった後で、"xmlDocument.Save("C:\AAA.xml")"をすると、

"プロセスはファイル "D:\AAA.xml" にアクセスできません。このファイルは別のプロセスが使用中です。"

みたいなメッセージが出てしまうのです。
スキーマのチェックを行わなければ、出ないのですが.....

これってスキーマチェック後に何か後処理が必要なのでしょうか?

PS."selectNodes"参考にさせて頂きます。
  ありがとうございます。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-03-03 19:13
るぱんです。

XML SchemaでXML文書の妥当性を検証するにコードで書いてあるのですが、非同期で検証する事が重要です。
ヘルプの「.async」メソッドの注意書きを読んでみて下さい。

セーブしようとしているファイルがアクセスを受けたまま
スキーマをあてる事でメモリ上に別の形でファイルとして保存されているのではないかな?
なんてことを考えましたが、裏は取ってません。

マイクロソフトのHPにもバリデータでチェックする方法が書いてあったと記憶しています。
何故非同期なのかまでは調べてませんので、
その理由を調べて頂けると、私の方としても非常にありがたい話ではあります。

業務ではDTDで・・・と言う話になりましたので、
汎用パースチェックツールをこさえてしまいました。(苦笑)

参考になりましたら幸です。
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2004-03-03 19:17
そのページに書いてあるサンプルは、ちゃんとXmlValidatingReaderのClose()を呼んでいないため、XmlWriterで書き出そうとした時点でも、まだストリームを開いています。

個人的にはSelectNodes()よりGetElementsByTagName()をお勧めします。SelectNodes()では、内部でXPathNavigatorを生成し、"//"(子孫の探索)というXPath評価を行うために、内部で(たぶん)恐ろしい数のXPathNavigator.Clone()の呼び出し=オブジェクト生成を行うことになります(つまり、重いです)。GetElementsByTagName()では、ArrayListを1つ生成するだけで、あとはツリーを頭から探索するだけです。

実際にMS.NETがそういう実装になっているかは知りません
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-03-03 19:37
るぱんさん、Atsushi.Enoさん、ありがとうございます。

Atsushi.Enoさんの"Close"を書いたら、問題なく通りました。
ありがとうございます!!

SelectNodes()よりGetElementsByTagName()はお二人の意見を参考にして、
今後決めていきたいと思います。

ついでで申し訳ないのですが、先程見ていただいたスキーマチェックのページなんですが、
同じようにコーディングしても、チェックがうまく通りません。

タグ名が間違っていたりすると、チェックで引っかかるのですが、
あるタグをまるまる削除しても、チェックで引っかからないのです。

詳しくは...
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9795&forum=7&0

もしお分かりになるんでしたら、ぜひ教えてください。
お願いします。
1

スキルアップ/キャリアアップ(JOB@IT)