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

1

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

没有前缀的属性与其包含的元素在同一个命名空间中。如果属性具有与其元素不同的命名空间,则只需对属性应用前缀。

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

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

于 2013-07-30T16:37:39.250 回答
0

尝试使用该Prefix属性?

MSDN 上的 XmlAttribute 前缀

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

于 2013-07-30T16:37:19.207 回答