我需要生成一个xml文档,其中所有元素和属性都以(相同的)命名空间为前缀(我知道这不是理想的,但遗憾的是需要与InfoPath进行互操作)。使用.NET XmlSerializer,使用正确的namepsace和前缀初始化,我通常没有问题生成前缀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 namespaces and attributes和here,其中说明:
“属性永远不会继承其父元素的名称空间。因此,如果属性具有正确的名称空间前缀,则该属性仅在名称空间中”
在这种情况下,序列化程序是否应该生成前缀以显示属性在该命名空间中?或者这不正确?
提前致谢!
更多信息:进一步调查(参见下面SamuelNeff的回答)已确定无前缀属性不会继承其包含元素的命名空间。这是否意味着XmlSerializer正在生成不合规格的属性?有没有办法强制它添加前缀?如果在XmlAttribute属性中添加了不同的名称空间uri,将添加前缀。
答案 0 :(得分:1)
OOPS:我对规范的解释是错误的。这个错误的响应被标记为答案,所以我无法删除它。遗憾。
没有前缀的属性与其包含元素位于同一名称空间中。如果属性的名称空间与其元素不同,则只需要为属性应用前缀。
默认命名空间声明不直接应用于属性名称;对无前缀属性的解释由它们出现的元素决定。
http://www.w3.org/TR/2009/REC-xml-names-20091208/#defaulting
答案 1 :(得分:0)
尝试使用Prefix
属性?
这是一个相当奇怪的问题,手动设置Prefix
和NamespaceURI
可能容易出错。您确定属性上的命名空间是否必要?虽然它可能不符合规范,但您正在使用的客户端或服务器应该跳过属性的包含元素(如果它位于foo
命名空间中吗?在这一点上,为什么它会关心你的属性有什么命名空间。