C# Xml序列化到XmlAttribute:当元素位于同一命名空间中时,命名空间前缀丢失

C# Xml序列化到XmlAttribute:当元素位于同一命名空间中时,命名空间前缀丢失,c#,xml,serialization,prefix,C#,Xml,Serialization,Prefix,我需要生成一个xml文档,其中所有元素和属性都以(相同)名称空间作为前缀(我知道这并不理想,但不幸的是,这是与InfoPath互操作所必需的)。使用.NET XmlSerializer(使用正确的名称和前缀初始化),生成带前缀的xml通常没有问题: xmlSerializer = new XmlSerializer(typeof(T)); xmlNamespaces = new XmlSerializerNamespaces(); xmlNamespaces.Add("foo", "www.na

我需要生成一个xml文档,其中所有元素和属性都以(相同)名称空间作为前缀(我知道这并不理想,但不幸的是,这是与InfoPath互操作所必需的)。使用.NET XmlSerializer(使用正确的名称和前缀初始化),生成带前缀的xml通常没有问题:

xmlSerializer = new XmlSerializer(typeof(T));
xmlNamespaces = new XmlSerializerNamespaces();
xmlNamespaces.Add("foo", "www.namespace.com");

这将生成xml

<foo:label id="0" xmlns:foo="www.namespace.com">
    <foo:text>content</foo:text>
</foo:label>

内容
问题是:前缀应用于所有内容,但同一名称空间中的“id”属性除外

我认为这可能是W3C规定的行为,声明为属于前缀元素的属性将继承该前缀。但是,似乎没有关联命名空间/前缀的属性的行为与此不同-请参见和,其中说明:

“属性从不继承其父元素的命名空间。因此,属性只有在具有正确的命名空间前缀时才位于命名空间中”

在这种情况下,序列化程序不应该生成一个前缀来显示该属性在该命名空间中吗?或者这是不对的

提前谢谢


更多信息:进一步的调查(参见下面SamuelNeff的回答)确定,未固定属性不会继承其包含元素的名称空间。这是否意味着XmlSerializer正在生成不合规格的属性?有没有办法强迫它添加前缀?如果在XmlAttribute属性中添加了不同的命名空间uri,它将添加一个前缀。

是否尝试使用
prefix
属性


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

哎呀:我对规范的解释是错误的。此错误响应被标记为答案,因此我无法删除它。对不起

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

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


谢谢@welegan,明智的建议,这确实是个奇怪的问题。希望我能很快放弃InfoPath互操作,这样就不需要对元素和属性进行双重前缀了。直接修改DOM中的属性前缀属性是备份计划,但如果可能的话,我希望避免这样做,因为理想情况下,我希望所有xml生成都由序列化程序完成(有趣的是,在反序列化时,它并不关心属性是否有前缀-我肯定这不正确)。啊,太好了,谢谢@SamuelNeff。我认为序列化程序如此公然地破坏名称空间会令人惊讶。那么这——大概是不正确吧?@Tryptamine42,看起来我对规范的解释是错误的,而你所指的问题是正确的。不带前缀的属性获取未固定范围的默认名称空间,而不是前缀元素的名称空间。我根据另一个问题运行了一些测试,jelovirt是正确的。感谢您回到这一点上-我昨晚对此感到困惑,因为我运行了一些类似的测试,其中XPath到无前缀属性不匹配。规范在这一点上似乎相当模糊(对于“非固定属性的解释由元素决定”意味着属性继承名称空间是有意义的),因此我认为我们的混淆是可以理解的!有趣的是,这可能意味着XmlSerializer正在生成不合规格的属性。。。
<foo:label id="0" xmlns:foo="www.namespace.com">
    <foo:text>content</foo:text>
</foo:label>