Инструмент Microsoft.Net XSD.exe, создание созданных классов и XMLSerialization - PullRequest
0 голосов
/ 01 мая 2018

У меня есть файл 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 () прямо из bat.

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

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

<?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>

1 Ответ

0 голосов
/ 01 мая 2018

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

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

namespace MyApplication.Models
{
    public partial class MyDoc
    {

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


    }
}

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

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

...