Во время поиска совета я наткнулся на различные решения: от 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. Любая помощь будет высоко ценится.