QA@IT
«回答へ戻る

回答を投稿

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

特に何も意味しません。

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をオーバーライドして自分で出力する必要がありそうです。

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

特に何も意味しません。

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なども使えますが単純な削除の例をコメントにつけておきます。

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


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