将命名空间前缀添加到 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);
:我正在 .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);