必要なことを行う方法を説明する前に、XML リーダー/パーサーは通常、要素に付けるプレフィックスを気にしないことを理解することが重要です。彼らは完全な名前空間だけを気にします。
つまり、サンプル XML フラグメントが読み込まれると、ns1
ビットは完全に破棄されます。("http://www.opentravel.org/OTA/2003/05", "Response")
内部的には、またはのような XML 名前空間/要素のペアが得られます("http://www.opentravel.org/OTA/2003/05", "Date")
。これを知っておくことが重要な理由は、XPath などで使用する XML データにさまざまな名前空間プレフィックスを割り当てることができ、それが正常に機能するためです。つまり、あなたの XML フラグメントを自分のプログラムに読み込み、それを"http://www.opentravel.org/OTA/2003/05"
prefix にマップする必要があると言い、ソース XML データにプレフィックスがなくても、"t"
XPath を使用して正しい結果を得ることができます。//t:Response
t
言い換えれば、特定のXML 名前空間プレフィックスを XML に取り込もうとするのは、本当に、本当に、本当に、問題にすべきではないため、気にするべきではありません。すべてが適切に機能するために特定のプレフィックスが必要な場合は、どこかで誰かが非常に間違ったことをしています。
そうは言っても、何らかの理由で特定の名前空間プレフィックスを出力する必要がある場合、またはそれらの見た目が気に入った場合は、次のようにXmlSerializerNamespaces
クラスを使用できます。
var ns = new XmlSerializerNamespaces();
ns.Add("NS1", "http://www.opentravel.org/OTA/2003/05");
var s = new XmlSerializer(typeof(Response));
var output = new StreamWriter(SOME_FILENAME);
s.Serialize(response, output, ns);
これを機能させるには、クラスを配置する完全な名前空間でクラスを装飾する必要もあります。すべての XML シリアライザー属性には、Namespace
この目的で使用するパラメーターがあります。たとえば、次のようになります。
[XmlRoot(ElementName = "Response",
Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response
{
}
オブジェクトをシリアル化すると、シリアライザーは名前空間マップで名前空間を検索し、選択したプレフィックスを適切な要素に適用します。