XmlSerializer.Serialize メソッドを使うと、ルート要素に名前空間が追加されます。
<?xml version="1.0"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</root>
これを、抑制する方法。
オーバーロードされた Serialize メソッドに、XmlSerializerNamespaces クラスのインスタンスを受け取るものがあります。ここに null を指定したり、何も追加していないインスタンスを指定しても、やはり規定の名前空間が出力されます。ステップインしてコードを見ると、null や Count が0の時は、規定の名前空間に置き換えるというコードが書かれていました。
ところが、XmlSerializerNamespaces クラスへの名前空間の追加については、なんのチェックもされていないようです(未確認)。ということで、空文字列の名前空間を追加したインスタンスを指定してあげます。
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
// null または、個数が0個だと、規定の名前空間が追加されるので、1個にする。
ns.Add("", "");
XmlSerializer xs = new XmlSerializer(typeof(TYPE));
using (StreamWriter writer = new StreamWriter(fileName, false)) {
xs.Serialize(writer, object, ns);
writer.Flush();
writer.Close();
}
<?xml version="1.0"?>
<root>
</root>
「xmlns:xsd="http://www.w3.org/2001/XMLSchema"」を、「xmlns="http://www.w3.org/2001/XMLSchema"」の様に出力させたいと思って、「ns.Add("", "http://www.w3.org/2001/XMLSchema");」としたら、なんにも出力されなくなったので気がついたのでした。
投稿日時 : 2011年1月19日 22:02