c# - Xml 序列化为 XmlAttribute : namespace prefix lost when Element in same namespace

标签 c# xml serialization prefix

我需要生成一个 xml 文档,其中所有元素和属性都以(相同的) namespace 为前缀(我知道这并不理想,但不幸的是,需要与 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 namespaces and attributeshere ,其中指出:

“属性永远不会继承其父元素的命名空间。因此,如果属性具有适当的命名空间前缀,则它仅在命名空间中”

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

提前致谢!

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

最佳答案

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

没有前缀的属性与其包含的元素位于相同的命名空间中。如果属性具有与其元素不同的命名空间,则只需为属性应用前缀。

Default namespace declarations do not apply directly to attribute names; the interpretation of unprefixed attributes is determined by the element on which they appear.

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

关于c# - Xml 序列化为 XmlAttribute : namespace prefix lost when Element in same namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952086/

相关文章:

java - Parcelable 对象中的属性为 NULL 值。为什么?

C++ vector 矩阵的 Boost 序列化

c# - 带有 HTML 表的 XML 以使用 C# 解析

java - 在文件上写入 DOM 时 XMLNS 属性被删除

xml - 使用Erlang xmerl_xpath提取xml文本时出现问题

c# - 在 C# 中将 Xml 反序列化为对象

c# - Web API 中的多个 GET 调用错误操作

c# - 为什么这个字符在 Visual Studio 中不可见?

c# - F# 类型提供程序 vs C# 接口(interface) + Entity Framework

c# - 使用 LINQ-to-SQL 返回已筛选子对象的对象