Как сериализовать в XmlChoice

Я создал классы C# с помощью xsd.exe из существующего xsd схема. Он сгенерировал следующее свойство:

public class TrackRequestSearchCriteria {

[System.Xml.Serialization.XmlElementAttribute("ConsignmentNumber", typeof(string))]
[System.Xml.Serialization.XmlElementAttribute("PieceReference", typeof(string))]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
public object[] Items {
    get {
        return this.itemsField;
    }
    set {
        this.itemsField = value;
    }
}

Ожидаемый xml:

<SearchCriteria>
    <ConsignmentNumber>#1</ConsignmentNumber>
</SearchCriteria>

Как инициализировать свойство Items, чтобы оно сериализовалось в <ConsignmentNumber>#1</ConsignmentNumber>?

new SomeRootElement {
   Items = new Object[] {
      // how to add ConsignmentNumber here
   }
}

@АлександрПетров


person Liero    schedule 18.12.2020    source источник
comment
Где-то в вашем TrackRequestSearchCriteria должно быть свойство с именем ItemsElementName. Не могли бы вы отредактировать свой вопрос, чтобы включить его? Вероятно, связано: Ошибка сериализации XML - недопустимое или отсутствующее значение идентификатора выбора "ItemsElementName" типа 'ItemsChoiceType[]'. И на самом деле, это может быть дубликат. Посмотрите и дайте мне знать.   -  person dbc    schedule 18.12.2020
comment
новый SomeRootElement { Элементы = новый объект [] { # 1 }   -  person jdweng    schedule 18.12.2020
comment
dbc: вы правы, есть ItemsElementName. Я только что опубликовал этот вопрос, чтобы @AlexanderPetrov мог ответить, потому что он ответил, что это вопрос, который был закрыт и больше никогда не открывался.   -  person Liero    schedule 18.12.2020
comment
Вам нужно установить перечисление: private ItemsChoiceType[] itemsElementNameField;   -  person jdweng    schedule 18.12.2020
comment
@Liero - Обмен стеками не имеет системы обмена сообщениями, поэтому, если вы думаете, что добавление @AlexanderPetrov к вашему вопросу отправит ему сообщение, то это не будет.   -  person dbc    schedule 18.12.2020


Ответы (1)


Я использовал xsd.exe для генерации набора классов по представленной схеме.

Следующий код дает желаемый xml.

var trackRequest = new TrackRequest
{
    SearchCriteria = new TrackRequestSearchCriteria
    {
        Items = new object[] { "#1" }, // new string[]
        ItemsElementName = new ItemsChoiceType[] { ItemsChoiceType.ConsignmentNumber }
    }
};
 
var xs = new XmlSerializer(typeof(TrackRequest));
xs.Serialize(Console.Out, trackRequest);
person Alexander Petrov    schedule 19.12.2020