2

すべての要素と属性に (同じ) 名前空間をプレフィックスとして付けた 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 が追加されている場合は、プレフィックスが追加されます

4

2 に答える 2

0

Prefixプロパティを使用してみませんか?

MSDN の XmlAttribute プレフィックス

これはかなり奇妙な問題です。手動で and を設定するPrefixと、NamespaceURIおそらくエラーが発生しやすくなります。属性の名前空間が必要であると確信していますか? foo仕様ではないかもしれませんが、使用しているクライアントまたはサーバーは、名前空間にある場合、属性の包含要素をスキップする必要がありますか? どの時点で、なぜ属性が持つ名前空間を気にするのでしょうか。

于 2013-07-30T16:37:19.207 に答える