Инструмент Microsoft.Net XSD.exe, создание инстанцированных классов и XMLSerialization

У меня есть файл XML-схемы (xsd), который сериализуется в файл именно так, как мне нужно, чтобы файл выглядел и вел себя. Однако я хочу, чтобы элемент верхнего уровня, в частности заголовок, был создан. Прямо сейчас исходный код, сгенерированный XSD.exe, просто предоставляет мне свойство «Заголовок», типизированное как объект заголовка, но не созданное.

Использование System.XML.Serialization специально для сериализации объекта из XML-файла в типизированный объект.

В общем, если я попытаюсь...

MyDoc.Header.HeaderField1 = "My value";

Я получаю ошибку нулевой ссылки.

Я должен...

MyDoc.Header = new MyApplication.Models.MyDoc.Header();
MyDoc.Header.HeaderField1 = "My value";

Я хотел бы иметь возможность просто заставить инструмент XSD.exe генерировать объект Header и в свойстве Header установить значение = new Header() прямо из летучей мыши.

Ничего страшного, легко обойти, но могло быть и поаккуратнее. :-п

Вот в основном схема, которая у меня есть.

<?xml version="1.0" encoding="utf-8"?>
<!-- 
xsd MyDoc.xsd /c /n:MyApplication.Models
-->
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MyDoc">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Header">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="HeaderField1" type="xsd:string" />
              <xsd:element name="HeaderField2" type="xsd:string" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="Items">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element maxOccurs="unbounded" name="Item">
                <xsd:complexType>
                  <xsd:sequence>
                      <xsd:element name="Field1" type="xsd:string" />
                      <xsd:element name="Field2" type="xsd:string" />
                      <xsd:element name="Field3" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xs:schema>

person Rob K.    schedule 30.04.2018    source источник


Ответы (1)


Я нашел лучший способ приблизиться к этому, просто добавив в код новый разделяемый класс для MyDoc.

Итак, я получаю сгенерированный файл C# MyDoc.cs, созданный XSD.exe. Затем я создал новый файл класса с именем MyDocPartial.cs. При этом похоже...

namespace MyApplication.Models
{
    public partial class MyDoc
    {

        public MyDoc()
        {
            this.Header = new MyDocHeader();
        }


    }
}

Существует отдельный частичный класс MyDoc, созданный XSD.exe. Однако у него нет определенного конструктора. Думаю, я просто пукнул здесь мозгом, но также решил поделиться с кем-нибудь еще. :)

Обратите внимание, что в этом частичном классе я также помещаю весь свой код сопоставления полей, код для упрощения добавления элементов и т. Д. Полный мозговой пердеж. Надеюсь, поможет. :)

person Rob K.    schedule 01.05.2018