Десериализация XML не работает после первого элемента - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь использовать десериализацию XML для преобразования XML-ответа хоста в объекты C #. Корневой элемент преобразуется в его объект, а 2-й элемент кажется преобразованным, но в любом случае это пустой элемент. Помимо этого, ни один из других элементов не конвертируется. Чего мне не хватает?

Я пробовал много разных вариантов объектов для каждого элемента и массивов элементов (даже если массив не нужен. Я даже обнаружил, что вы можете вставить XML в редактор в Visual Studio, и он создаст сериализованные объекты ( редактировать, вставлять специальные, вставить XML как классы), но я не смог заставить что-либо работать!

Вот как выглядит XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//MySite/DTD MySite PaymentService v1//EN" "http://dtd.mysite.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="ExampleCode1">
    <reply>
        <orderStatus orderCode="ExampleOrder1">
            <reference id="YourReference">https://payments-test.mysite.com/app/hpp/integration/wpg/corporate?OrderKey=NGPPTESTMERCH1%5Ejsxml3835829684&amp;Ticket=00146321872957902pqKhCTUf0vajKCw-X5HqZA</reference>
        </orderStatus>
    </reply>
</paymentService>

-ИЛИ-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//MySite//DTD MySite PaymentService v1//EN" "http://dtd.MySite.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="ExampleCode1">
   <reply>
      <orderStatus orderCode="ExampleOrder1">
         <error code="2">
            <![CDATA[Invalid address: Postal code is missing or empty.]]>
        </error>
      </orderStatus>
   </reply>
</paymentService>

Вот объекты:

   [Serializable]
   [XmlRoot(ElementName = "paymentService")]
   public partial class PaymentResponse
   {
      [XmlAttribute()]
      public string version { get; set; }

      [XmlAttribute()]
      public string merchantCode { get; set; }

      [XmlElement("reply")]
      public Reply reply { get; set; }
   }
   [Serializable]
   public partial class Reply
   {
      [XmlElement("orderStatus")]
      public OrderStatus orderStatus {get; set; }
   }
   [Serializable]
   public partial class OrderStatus
   {
         [XmlAttribute()]
         public string orderCode {get; set; }

         [XmlElement(ElementName = "reference",IsNullable =true)]
         public Reference reference {get; set; }

         [XmlElement(ElementName = "error",IsNullable =true)]
         public Error error {get; set; }
   }

Вот призыв к десериализации:

XmlSerializer serializer = new XmlSerializer(typeof(PaymentResponse));
        PaymentResponse response = (PaymentResponse)serializer.Deserialize(reader);

Единственное, что возвращается в коде продавца и в версии из PaymentResponse.

1 Ответ

0 голосов
/ 30 мая 2019

Возможно, вам придется сообщить сериализатору, что делать с вашими непримативными типами.

Попробуйте изменить это

[XmlElement(ElementName = "reference",IsNullable =true)]
public Reference reference {get; set; }

[XmlElement(ElementName = "error",IsNullable =true)]
public Error error {get; set; }

к этому

[XmlElement(ElementName = "reference", Type = typeof(Reference), IsNullable = true)]
public Reference reference {get; set; }

[XmlElement(ElementName = "error", Type = typeof(Error), IsNullable = true)]
public Error error {get; set; }

Удачи!

...