C#でXMLのNameSpaceを出力しないように設定する

こんにちは。beaglesoftの真鍋です。

DHTMLXを利用してフロントエンドの開発を行っているのですが、JSONに対応したとDocumentに記載があってもいまいち正しく動作しないことが多いような気がします。XMLだと安定して動作してくれるので、いつまで経ってもXMLを出力する必要に駆られています。

さて、C#でエンティティクラスを作成してXMLを出力するときにNameSpaceが付いてしまうことがあります。NameSpaceとは下記のような内容ですね。

<tree id="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CLIENT_REQUEST_ID="1">
...
</tree>

DHTMLXのXMLではこのようなNameSpaceはもちろん必要ありませんので取り除きましょう。最初はXmlRoot属性に何かプロパティを設定するのかと思ったのですが、違いました。

 [XmlRoot(ElementName = "tree")]
public class KanjoKamokuTree
{
...
}

XMLをシリアライズするときにXmlSerializerNamespacesで空文字を指定すると上手くいきます。

var xmlnsEmpty = new XmlSerializerNamespaces();

// ↓これを指定すると属性は設定されない
xmlnsEmpty.Add("", "");

var xml = "";
using (var ms = new MemoryStream())
{
        // ↓ここで設定する
    serializer.Serialize(ms, kanjoKamokuTree, xmlnsEmpty);
    xml = Encoding.UTF8.GetString(ms.ToArray(), 0, (int) ms.Length);
}

うーん、なんともどうやって調べたのでしょうか…。もちろん、私はStackOverflowで調べたのですが、あちらの方はどこからこのような情報を仕入れているんでしょうね。

c# - how to remove namespace from XML root element? - Stack Overflow

プログラミング.NET FrameworkをHontoで購入しましたが、epubだったのでiPhoneでも読めますよー。

プログラミング.NET Framework 第4版

プログラミング.NET Framework 第4版