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

时间:2015-02-26 15:19:06

标签: c# xml asp.net-web-api

:ri我正在开发一个.Net web api,我们有一个基类来处理来自api的所有响应。该类将始终作为请求的根返回,包含用户在其中请求的任何数据。

因此,用户将始终收到以下行的回复:

<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>

我有以下代码返回上述罚款:

[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}

因此,无论返回数据的根标记是什么,它都将始终更改为“内容”。因此,如果我的代码中的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")]

返回为:

<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>

2 个答案:

答案 0 :(得分:2)

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

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

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

请参阅XML Serialization and namespace prefixes,了解如何实现目标的简单示例。

答案 1 :(得分:1)

尝试这样做:

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);