すべての要素と属性に (同じ) 名前空間をプレフィックスとして付けた xml ドキュメントを作成する必要があります (これが理想的ではないことはわかっていますが、残念ながら InfoPath との相互運用には必要です)。正しいネームスペースとプレフィックスで初期化された .NET XmlSerializer を使用すると、通常、プレフィックス付きの xml を生成するのに問題はありません。
xmlSerializer = new XmlSerializer(typeof(T));
xmlNamespaces = new XmlSerializerNamespaces();
xmlNamespaces.Add("foo", "www.namespace.com");
...
[XmlRoot(Namespace = "www.namespace.com")]
public class label
{
[XmlAttribute(Namespace = "www.namespace.com")]
public string id { get; set; }
[XmlElement(Namespace = "www.namespace.com")]
public string text { get; set; }
}
これにより、xmlが生成されます
<foo:label id="0" xmlns:foo="www.namespace.com">
<foo:text>content</foo:text>
</foo:label>
問題はこれです: プレフィックスは、同じ名前空間の「id」属性を除くすべてに適用されます。
これは W3C によって規定された動作であり、接頭辞付きの要素に属していると宣言された属性はその接頭辞を継承するのではないかと考えました。ただし、名前空間/プレフィックスが関連付けられていない属性は、このようには動作しないようです。XML 名前空間と属性を参照してください。
「属性は、その親要素の名前空間を継承することはありません。そのため、属性は、適切な名前空間プレフィックスがある場合にのみ名前空間に含まれます」
この場合、シリアライザーは、属性がその名前空間にあることを示すプレフィックスを生成するべきではありませんか? それともこれは正しくありませんか?
前もって感謝します!
詳細情報: 詳細な調査 (以下の SamuelNeff の回答を参照) により、プレフィックスのない属性は、それらを含む要素の名前空間を継承しないことが判明しました。これは、XmlSerializer が仕様外の属性を生成していることを意味しますか? プレフィックスを強制的に追加する方法はありますか? XmlAttribute 属性に別の名前空間 uri が追加されている場合は、プレフィックスが追加されます。