将命名空间前缀添加到 XmlRoot 属性

Adding a namespace prefix to an XmlRoot Attribute

:我正在 .Net web api 上工作,我们有一个基础 class 来处理来自我们 api 的所有响应。此 class 将始终作为请求的根 return 编辑,其中包含用户请求的任何数据。

因此用户将始终收到如下响应:

<Content xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd">
        <Item>Information Here</Item>
</Content>

我有以下代码return上面的代码:

[XmlRoot(ElementName = "Content", Namespace = "http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd")]
public class MyResponse<T> : IMyResponse<T>
    where T : class
{//rest of class}

所以不管return数据的根标签是什么,都会被改成"Content"。因此,如果我的代码中的 T 是一个 PersonList,它将在 XML 中更改为 "Content"。这是为了让我们的回复保持一致。

现在我需要为标签添加前缀。 "ri:" 所以收到的响应将是:

<ri:Content xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ri="http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd">
        <Item>Information Here</Item>
</ri:Content>

每个接近我要求的问题都提供了在代码中添加前缀的解决方案。

我想知道是否有办法使用属性来做到这一点?

Here is a similar question that was never answered

编辑:将 ri: 添加到 XmlRoot 属性的 ElementName 不起作用。

[XmlRoot(ElementName = "ri:Content", Namespace = "http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd")]

Returns 为:

<ri_x003A_Content xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd">
            <Item>Information Here</Item>
    </ri_x003A_Content>

简短的回答是 不,您目前无法通过 XML 序列化属性添加命名空间前缀。

属性仅描述 XML 文档的 结构 。命名空间前缀在很大程度上与 XML DOM 无关——重要的是元素具有正确的命名空间。前缀仅对该文档的文本表示感兴趣,这完全是一个 格式化 问题并且超出了序列化属性目的的范围。

如果您需要控制正在写入的 XML 文本的格式,您需要控制格式化过程,这需要您修改执行序列化的代码。

请参阅 XML Serialization and namespace prefixes 以获取有关如何实现您想要的内容的真正简单示例。

尝试这样做:

var serializerNamespaces = new XmlSerializerNamespaces();
serializerNamespaces.Add("ri", http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd");

然后

    [Serializable]
    [XmlRoot(ElementName = "Content ", Namespace = "http://www.example.com/schemas/TestNamespace/Interface6/Schema.xsd")]
    class MyResponse<T> : IMyResponse<T>
    where T : class

然后执行序列化,包括 XmlSerializerNamespaces 作为参数:

 var serializer = new XmlSerializer(typeof(T));
 serializer.Serialize(xmlWriter, object, serializerNamespaces);