Измените префикс пространства имен по умолчанию при выполнении XML сериализации для ответа - PullRequest
1 голос
/ 04 августа 2020

префикс XMLNamespace по умолчанию, установленный в ответе, отличается для. Net Core и MVC Я пытаюсь отразить поведение, чтобы оно было таким же, как MVC.

Я не удалось найти, как установлены d1p1, d2p1. Net Основной код. Я считаю, что это префиксы пространства имен по умолчанию. Но я хочу, чтобы это было a, b, c et c, в отличие от d1p1, d2p1, d3p1, et c

Я не настраивал XMLFormatter ни в одном из проектов. Я считаю, что это способ исправить, но я не могу понять, где мне нужно go искать

В Asp. Net Базовый веб-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>

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Я не настраивал XMLFormatter ни в одном из проектов. Я считаю, что это способ исправить, но я не могу понять, где мне нужно go искать

Вы можете добавить поля типа XmlSerializerNamespaces в трех классах Detail, ActionItems и Requestor.

В соответствии с вашей структурой 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);
    }

Вот результат: введите описание изображения здесь

0 голосов
/ 06 августа 2020

Если допустимо иметь объявления псевдонимов на уровне root (т.е. <ReservationDetail xmlns:a="http://schemas.datacontract.org/2004/07/KKR.Service.Presentation.ReservationModel"> et c - который имеет ту же семантику, но не совсем тот же макет), то этого можно достичь, предоставив объект XmlSerializerNamespaces в вызове Serialize. Например:

using System;
using System.Xml.Serialization;

[XmlRoot(Namespace = "http://foo/foo")]
public class Foo
{
    [XmlElement(Namespace = "http://bar/bar")]
    public Bar Bar { get; set; }
}
public class Bar
{}
static class P
{
    static void Main()
    {
        var ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        // your aliases and uris here!
        ns.Add("a", "http://foo/foo");
        ns.Add("b", "http://bar/bar");
        var obj = new Foo { Bar = new Bar() };
        var ser = new XmlSerializer(obj.GetType());
        ser.Serialize(Console.Out, obj, ns);
    }
}

, который имеет вывод:

<a:Foo xmlns:b="http://bar/bar" xmlns:a="http://foo/foo">
  <b:Bar />
</a:Foo>
...