: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>
答案 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);