Xml序列化为XmlAttribute:当Element位于同一命名空间中时,命名空间前缀丢失

本文关键字:命名空间 前缀 于同一 序列化 XmlAttribute Element Xml | 更新日期: 2023-09-27 18:25:42

我需要生成一个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,则添加前缀。

Xml序列化为XmlAttribute:当Element位于同一命名空间中时,命名空间前缀丢失

OOPS:我对规范的解释是错误的。这个不正确的回答被标记为答案,所以我无法删除它。对不起。

不带前缀的属性与其包含的元素位于同一命名空间中。仅当属性的命名空间与其元素不同时,才需要将前缀应用于该属性。

默认命名空间声明不直接应用于属性名称;未固定属性的解释由它们出现的元素决定。

http://www.w3.org/TR/2009/REC-xml-names-20091208/#defaulting

是否尝试使用Prefix属性?

MSDN 上的XmlAttribute前缀

这是一个相当奇怪的问题,手动设置PrefixNamespaceURI也可能容易出错。你确定属性上的名称空间是必要的吗?虽然可能不需要规范,但如果属性的包含元素在foo命名空间中,则您正在使用的客户端或服务器应该跳过该元素,对吗?在这一点上,它为什么会关心您的属性具有什么名称空间。