C # .net 4.6 XmlSerializerNamespaces Проблема вывода XmlSerializer - PullRequest
0 голосов
/ 15 октября 2018

Мне нужен следующий вывод из классов Pojo в Xml.Это .net 4.6.1, C #.Проблема в пространствах имен и производимых префиксах.Как получить узел: <blablubb:Message SOAP-ENV:mustUnderstand="1" xmlns:blablubb="urn:blablubb-com:schemas:blablubb">

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header>
        <blablubb:Message SOAP-ENV:mustUnderstand="1" xmlns:blablubb="urn:blablubb-com:schemas:blablubb">
           <blablubb:Type>INET_TRANS</blablubb:Type>
           <blablubb:Function>RECEIVE_CUSTOMER_ORDER</blablubb:Function>
           <blablubb:Sender>CONNECT</blablubb:Sender>
           <blablubb:Receiver>CONNECT</blablubb:Receiver>
           <blablubb:SentAt>2018-08-30T10:43:37+02:00</blablubb:SentAt>
           <blablubb:ExpiresAt>2018-09-30T10:43:37+02:00</blablubb:ExpiresAt>
        </blablubb:Message>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body><ORDERS xmlns="urn:blablubb-com:schemas:inbound_distribution_transactions_create_customer_order_request" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <BUYER></BUYER>
 <CONTACT_REFERENCE>OAK</CONTACT_REFERENCE>
 <EAN_LOCATION_DELIVERY_ADDRESS>10901000</EAN_LOCATION_DELIVERY_ADDRESS>
 <CURRENCY_CODE>EUR</CURRENCY_CODE>
 <ORDER_DATE>2018-08-27T09:01:01</ORDER_DATE>
 <OUR_CUSTOMER_NO>2</OUR_CUSTOMER_NO>
 <SUPPLIER_ADDRESS_NO></SUPPLIER_ADDRESS_NO>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Pojos, которые сериализуются:

SoapDocument:

 [Serializable]
 [XmlRoot("Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
 [XmlInclude(typeof(SoapHeader))]
 public class SoapDocument {
     [XmlElement("Header")]
     public SoapHeader soapHeader { get; set; }

     [XmlElement("Body",typeof(IfsOrdersXmlDocument))]
     public object soapBody { get; set; }
 }

SoapHeader:

[Serializable]
[XmlRoot("Header")]
[XmlInclude(typeof(SoapMessage))] // include type class    IfsOrderLineXmlDocument
public class SoapHeader {
[XmlElement("Message", Namespace = "urn:blablubb-com:schemas:blablubb")]
public SoapMessage soapMessage { get; set; }
     }

SoapBody:

[Serializable]
[XmlInclude(typeof(IfsXmlDocument)),  XmlInclude(typeof(IfsOrdersXmlDocument))]
[SoapInclude(typeof(IfsXmlDocument)), SoapInclude(typeof(IfsOrdersXmlDocument))]
public class SoapBody {
[XmlElement("Body")]
public IfsXmlDocument soapBody { get; set; }
}

SoapMessage:

[Serializable]
//[XmlType("blablubb")]
[XmlRoot("Message", Namespace = "urn:blablubb-com:schemas:blablubb")]
public class SoapMessage {
[XmlElement("Type")]
public string Type { get; set; }
[XmlElement("Function")]
public string Function { get; set; }
[XmlElement("Sender")]
public string Sender { get; set; }
[XmlElement("Receiver")]
public string Receiver { get; set; }
[XmlElement("SentAt")]
public string SentAt { get; set; }
[XmlElement("ExpiresAt")]
public string ExpiresAt { get; set; }
}

Код, который создает Xml, поэтому проблема заключается в пространствах имен и префиксах ......

XmlSerializerNamespaces ns = createSoapDocument();
XmlSerializer serializer = new     XmlSerializer(typeof(HeinzApi.Soap.SoapDocument), new Type[] { typeof(IfsXmlDocument), typeof(IfsOrdersXmlDocument) });
FileStream fs = new FileStream(xmlTargetPath, FileMode.Create);
serializer.Serialize(fs, soapDocument, ns);
fs.Close();`

И вот что я получаю:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <Message xmlns="urn:blablubb-com:schemas:blablubb">
      <Type>INET_TRANS</Type>
      <Function>RECEIVE_CUSTOMER_ORDER</Function>
      <Sender>CONNECT</Sender>
      <Receiver>CONNECT</Receiver>
      <SentAt>2018-01-03T10:43:37+02:00</SentAt>
      <ExpiresAt>2018-08-02T10:43:37+02:00</ExpiresAt>
    </Message>
  </SOAP-ENV:Header>
</SOAP-ENV:Envelope>

Это метод createSoapDocument, который добавляет пространства имен к объекту пространств имен XmlSerializer:

private XmlSerializerNamespaces createSoapDocument() {
    soapMessage.Type = "INET_TRANS";
    soapMessage.Function = "RECEIVE_CUSTOMER_ORDER";
    soapMessage.Sender = "CONNECT";
    soapMessage.Receiver = "CONNECT";
    soapMessage.SentAt = "2018-01-03T10:43:37+02:00";
    soapMessage.ExpiresAt = "2018-08-02T10:43:37+02:00";

    soapHeader.soapMessage = soapMessage;
    soapDocument.soapHeader = soapHeader;
    //soapDocument.soapBody = (IfsXmlDocument)targetXmlBaseDocument; ;
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
    ns.Add("blablubb", "urn:blablubb-com:schemas:blablubb");
    return ns;
}

Редактировать: Это результат после добавления пространств имен в XmlSerializerNamespaces:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:blablubb="urn:blablubb-com:schemas:blablubb" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <blablubb:Message>
      <blablubb:Type>INET_TRANS</blablubb:Type>
      <blablubb:Function>RECEIVE_CUSTOMER_ORDER</blablubb:Function>
      <blablubb:Sender>CONNECT</blablubb:Sender>
      <blablubb:Receiver>CONNECT</blablubb:Receiver>
      <blablubb:SentAt>2018-01-03T10:43:37+02:00</blablubb:SentAt>
      <blablubb:ExpiresAt>2018-08-02T10:43:37+02:00</blablubb:ExpiresAt>
    </blablubb:Message>
  </SOAP-ENV:Header>
</SOAP-ENV:Envelope>

1 Ответ

0 голосов
/ 15 октября 2018

Вам необходимо сообщить сериализатору о вашем пространстве имен blahblubb, добавив его в свой объект XmlSerializerNamespaces.

ns.Add("blablubb", "urn:bla-com:schemas:blablubb");

Не забудьте изменить

[XmlElement("Body")]

на

[XmlElement("Body", Namespace="urn:bla-com:schemas:blablubb")]
...