QA@IT

DOCTYPEの角括弧前スペースについて

7615 PV

アプリケーション(Adobe FrameMaker)で開く前に、XMLファイルを加工(条件に合ったノードを削除)するC#のプログラムを作成しています。
プログラムとしては下記のかんじです。
[C#]

    XmlDocument doc = new XmlDocument();
    doc.Load(input_Path);
    // ここでXML加工
    doc.Save(output_Path);

この処理の中で、XMLファイルのDOCTYPE宣言部分が

<!DOCTYPE rootElement [
]>

から

<!DOCTYPE rootElement[
]>

と角括弧"["の前のスペースが無くなります。
(このおかげで、アプリケーションの読み込みエラーになります。)

角括弧"["前のスペースは何を意味するのでしょうか?
また、スペースを保持する方法ご存知の方いませんか。

回答

角括弧"["前のスペースは何を意味するのでしょうか?

特に何も意味しません。

https://www.w3.org/TR/2008/REC-xml-20081126/
によれば

[28]    doctypedecl    ::=      '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
[3]     S      ::=      (#x20 | #x9 | #xD | #xA)+

なので仕様としては必須ではなさそうです。

また、スペースを保持する方法

簡単にためしただけですが XmlDocumentではなく、XDocument (System.Xml.Linq)を使用すれば維持されるようです。

利用方法は異なりますが、個人的にこちらの利用をお勧めします。
Linqなども使えますが単純な削除の例をコメントにつけておきます。

var doc = XDocument.Load(input_Path);
// doc.Descendants("inner1").Remove(); // rootElement/inner1 を削除する場合
doc.Save(output_Path, SaveOptions.None);

調査不足かもしれませんが、XmlDocumentだと特にオプションは見当たらなかったので、XmlDocumentで実装したい場合はXmlTextWriterをオーバーライドして自分で出力する必要がありそうです。

編集 履歴 (0)
  • flied_onionさん、ありがとうございます。

    スペースについては仕様上は意味がないとのことですが、XMLを開くアプリケーションによっては違いが出ることもわかりました。
    今後が何かと注意するようにします。

    返事が遅くなりましたが、解決しました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。