Как сериализовать в 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
   }
}

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

Где-то в вашем TrackRequestSearchCriteria должно быть свойство с именем ItemsElementName. Не могли бы вы отредактировать свой вопрос, чтобы включить его? Вероятно, связано: Ошибка сериализации XML — недопустимое или отсутствующее значение идентификатора выбора «ItemsElementName» типа «ItemsChoiceType[]». И на самом деле, это может быть дубликат. Посмотрите и дайте мне знать.

dbc 18.12.2020 17:12

Новый SomeRootElement { Элементы = новый объект [] { "# 1" }

jdweng 18.12.2020 17:15

Dbc: вы правы, есть ItemsElementName. Я только что опубликовал этот вопрос, чтобы @AlexanderPetrov мог ответить, потому что он ответил, что это вопрос, который был закрыт и больше никогда не открывался.

Liero 18.12.2020 17:18

Вам нужно установить перечисление: private ItemsChoiceType[] itemsElementNameField;

jdweng 18.12.2020 17:30

@Liero - Обмен стеками не имеет системы обмена сообщениями, поэтому, если вы думаете, что добавление @AlexanderPetrov к вашему вопросу отправит ему сообщение, то это не так.

dbc 18.12.2020 17:34
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
5
244
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);

Другие вопросы по теме