c# - 在执行响应的 XML 序列化时修改默认命名空间前缀

标签 c# asp.net-core serialization xml-serialization

响应中设置的默认 XMLNamespace 前缀对于 .Net Core 和 MVC 是不同的 我正在尝试镜像该行为,使其与 MVC 相同。

我无法找到 .Net Core 代码中如何设置 d1p1,d2p1。我相信它们是默认的命名空间前缀。但我想要它 a、b、c 等,而不是 d1p1、d2p1、d3p1 等

I have not customised XMLFormatter in either project . I believe this is the way to fix but i cannot understand where i need to go looking

在 Asp.Net Core Web API 中:

<ReservationDetail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationResponseModel">
    <Detail xmlns:d2p1="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationModel">
        <d2p1:ActionItems xmlns:d3p1="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel"/>
        <d2p1:Association>
            <d2p1:ReservationAssociation>
                <d2p1:Requestor xmlns:d5p1="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel">
                    <d5p1:ChannelName>NCC</d5p1:ChannelName>
                </d2p1:Requestor>
            </d2p1:ReservationAssociation>
        </d2p1:Association>
        <d2p1:Channel>NCC</d2p1:Channel>

在 WCF(.Net Framework)中:


<ReservationDetail xmlns="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationResponseModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Detail xmlns:a="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationModel">
        <a:ActionItems xmlns:b="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel"/>
        <a:Association>
            <a:ReservationAssociation>
                <a:Requestor xmlns:b="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel">
                    <b:ChannelName>NDC</b:ChannelName>
                </a:Requestor>
            </a:ReservationAssociation>
        </a:Association>
        <a:Channel>NDC</a:Channel>

最佳答案

I have not customised XMLFormatter in either project . I believe this is the way to fix but i cannot understand where i need to go looking

您可以在 DetailActionItemsRequestor 三个类中添加 XmlSerializerNamespaces 类型的字段。

根据您的xml结构,我创建了以下类(您可以自己修改一些不同的地方。):

 public class ReservationDetail
    {
        public Detail Detail { get; set; }
    }

    [XmlType(Namespace = "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationModel")]
    public class Detail
    {
        public ActionItems ActionItems { get; set; }
        public Association Association { get; set; }
        public string Channel { get; set; }
        [XmlNamespaceDeclarations]
        public XmlSerializerNamespaces ns;
    }

    [XmlType(Namespace = "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel")]
    public class ActionItems
    {
        public string data { get; set; }

        [XmlNamespaceDeclarations]
        public XmlSerializerNamespaces ns;
    }
    public class Association
    {
        public ReservationAssociation ReservationAssociation { get; set; }
    }

    public class ReservationAssociation
    {
        public Requestor Requestor { get; set; }
    }

    [XmlType(Namespace = "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel")]
    public class Requestor
    {
        public string ChannelName { get; set; }

        [XmlNamespaceDeclarations]
        public XmlSerializerNamespaces ns;
    }

代码:

  public IActionResult ReturnXml()
    {
        ReservationDetail request = new ReservationDetail()
        {
            Detail = new Detail()
            {
                ActionItems = new ActionItems() { },
                Channel = "NCC",
                Association = new Association()
                {
                    ReservationAssociation = new ReservationAssociation()
                    {
                        Requestor = new Requestor()
                        {
                            ChannelName = "NCC"
                        }
                    }
                }
            }
        };

        request.Detail.ns = new XmlSerializerNamespaces();
        request.Detail.ns.Add("a", "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationModel");
        request.Detail.ActionItems.ns = new XmlSerializerNamespaces();
        request.Detail.ActionItems.ns.Add("b", "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel");
        request.Detail.Association.ReservationAssociation.Requestor.ns = new XmlSerializerNamespaces();
        request.Detail.Association.ReservationAssociation.Requestor.ns.Add("b", "http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.CommonModel");
        return Ok(request);
    }

结果如下: enter image description here

关于c# - 在执行响应的 XML 序列化时修改默认命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63252215/

相关文章:

c# - SingleLine 选项和\n 字符串结尾之前的正则表达式问题

c# - 即使项目生成,Visual Studio 也会显示错误

c# - ASP.NET Core 中的 ConfigureServices() 和 Configure() 有什么区别?

unit-testing - 替换 WebApplicationFactory 中的 DbContext 进行单元测试

perl - 我应该使用 Storable 还是 FreezeThaw 将 Perl 数据序列化为 cookie 值?

java - Mongodb保存对象列表

c# - 使用泛型类的参数作为事件类型

c# - 将对象注入(inject)表单

asp.net-core - Asp.net core 2.1 中的外部登录认证

python - Django Rest Framework - 嵌套序列化程序是延迟加载的吗?