いつも参考にさせていただいています。
元となるXMLを読み込み値を設定して
新しくXMLファイルを書き出したいです。
調べた結果DataSetにベースとなるXMLを読み込み
DataRowに値を設定して書き出すという方法が簡単だったので
とりあえず読み込んで書き出すだけのプログラムを作成しました(抜粋)
'入力・出力ファイル指定
Dim LoadFile As String = "input.xml"
Dim CreateFile As String = "output.xml"
'XML読み込み
Dim dSet As New DataSet
dSet.ReadXml(LoadFile)
'XMLの設定
Dim st As New XmlWriterSettings
With st
'インデントにタブを指定
.Indent = True
.IndentChars = ControlChars.Tab
End With
Using writer As XmlWriter = XmlWriter.Create(CreateFile, st)
'Xml書き込み
dSet.WriteXml(writer)
writer.Close()
End Using
dSet.Dispose()
これを実行すると元のファイルと違う並び順で出力され
VSで開くと電子署名のSignatureValueで警告がでています。
要素 名前空間 'http://www.w3.org/2000/09/xmldsig#' の 'Signature' には無効な子要素 名前空間 'http://www.w3.org/2000/09/xmldsig#' の 'SignatureValue' が含まれています。必要とされる要素は 名前空間 'http://www.w3.org/2000/09/xmldsig#' の 'SignedInfo' です。
これは並び順が違うことが原因のようで
元ファイルと同じ順番に入れ替えると警告は消えます。
読み込みの時点では順番は問題無いようですが
(DataColumnの値をチェックしました)
属性が指定されていると書き出すときに後回しにされてしまっているようです。
元ファイルと同じ順序で出力することはできないのでしょうか?
XMLの内容は勝手ながら掲載できないのですが
リンクの「結果の包含 XML 署名は次のとおりです。」の下のデータで試しても同じ現象が起きました。
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/xmldsig/XMLDigitalSignature.html
あと特に問題はないと思うのですが
元ファイルは値が空の場合は<hoge/>なのに
出力ファイルは<hoge></hoge>になっています。
XmlWriterSettingsに設定するのかな?と探してみたのですが見当たらないようです。
元ファイルのように省略させることは可能でしょうか?
XML自体よく分かっていないので
説明不足な点があるかもしれませんがよろしくお願い致します。
XpPro sp3/VB2008/WinForm
XML の操作に DataSet は、ちょっと使いどころが違う感じです。
System.Xml.XmlDocument(.NET 3.5 を使えるのなら System.Xml.Linq.XDocument でも)の方が良いんではないでしょうか。
Hongliangさんお返事ありがとうございます。
> XML の操作に DataSet は、ちょっと使いどころが違う感じです。
> System.Xml.XmlDocument(.NET 3.5 を使えるのなら System.Xml.Linq.XDocument でも)の方が良いんではないでしょうか。
そうですか。。
DataSetなら自分の位置とか気にせずに済んだので
簡単にできると思ったのですが。
Hongliangさんに教えていただいたXmlDocumentで
もう一度作り直してみようと思います。
ありがとうございました。
ツイート | ![]() |