Как остановить вывод пустого тега из коллекции XmlSerializer? - PullRequest
0 голосов
/ 04 июня 2019

Во время поиска совета я наткнулся на различные решения: от IXMLSerializer до ShouldSerialize и до простого .Replace () или RegEx. Я не хочу использовать последние два, так как считаю, что они неэффективны, но у меня недостаточно знаний C # для реализации предложений, связанных с Serializer, в моем случае, поэтому надеюсь, что кто-нибудь посоветует, пожалуйста.

У меня есть коллекция "Details" различных вариантов, связанных с поездками - перелет, поезд, гостиница и т. Д. Класс XSD был предоставлен нам третьей стороной, и ниже приведена соответствующая часть:

[XmlRoot(ElementName = "Details")]
public class Details
{
    [XmlElement(ElementName = "Flight")]
    public Flight Flight { get; set; }
    [XmlElement(ElementName = "Train")]
    public Train train { get; set; }
    [XmlElement(ElementName = "RentalCar")]
    public RentalCar rentalCar { get; set; }
    [XmlElement(ElementName = "Hotel")]
    public Hotels Hotel { get; set; }
    [XmlElement(ElementName = "Bus")]
    public Bus Bus { get; set; }

}

Каждый из элементов имеет свой собственный XMLRoot, например, Отель один:

 [XmlRoot(ElementName = "Hotel")]
    public class Hotels
    {
        [XmlElement(ElementName = "VoucherNo")]
        public string VoucherNo { get; set; }
        [XmlElement(ElementName = "VoucherRef")]
        public string VoucherRef { get; set; }
        [XmlElement(ElementName = "DepartureDate")]
        public string departureDate;
        [XmlElement(ElementName = "DepartureDateFieldSpecified")]
        public bool departureDateFieldSpecified;
        [XmlElement(ElementName = "ReturnDate")]
        public string returnDate;
        [XmlElement(ElementName = "ReturnDateFieldSpecified")]
        public bool returnDateFieldSpecified;
    }

Детали, в свою очередь, являются частью продукта

[XmlRoot(ElementName = "Product")]
public class Product
{
    [XmlElement(ElementName = "ArticleNumber")]
    public int articleNumber { get; set; }
//many other elements
    public Details Details { get; set; }

}

В моем коде я объявляю коллекцию objProductDetails

Details objProductDetails = new Details();

и заполните соответствующими данными. некоторые элементы могут оставаться пустыми: не во всех поездках есть поезд или арендованный автомобиль, поэтому, например, я могу заполнить только элемент Hotel. Я использую не нулевую проверку, как показано ниже

if (objHotel != null)
      objProductDetails.Hotel = objHotel;

if (objRentalCar != null)
      objProductDetails.rentalCar = objRentalCar;

В настоящее время, когда я выполняю свой код, я получаю все данные для отеля, но пустой тег для всего остального:

Отель:

<qfl:Product>
  <qfl:ArticleNumber>100</qfl:ArticleNumber>
     <qfl:Details>
        <qfl:Hotel>
          <qfl:VoucherNo>1234</qfl:VoucherNo>

/...... rest of the result

еще

 <qfl:Product>
    <qfl:ArticleNumber>180</qfl:ArticleNumber>
       <qfl:Details />
  </qfl:Product>
        /...... rest of the result

Как лучше всего пропустить пустой элемент Details, чтобы получить следующее:

 <qfl:Product>
     <qfl:ArticleNumber>180</qfl:ArticleNumber>
 </qfl:Product>

N.B. После комментариев Ивана, приведенных ниже, у меня, похоже, возникла другая проблема - хотя объект аренды автомобиля пуст, objRentalCar == null равно false. Любая помощь будет высоко ценится.

enter image description here

1 Ответ

1 голос
/ 04 июня 2019

Вы создаете пустой Details объект, соответственно он сериализуется как пустой тег. Если вы не хотите сериализовать его, вы должны проверить, что все свойства в этом объекте будут пустыми и не создавать объект или не устанавливать свойство Details в Product объекте.

if (objHotel != null || objRentalCar != null || ...)
{
    product.Details = objProductDetails;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...