Класс, сгенерированный из схемы с использованием xsd.exe, не содержит значений перечисления - PullRequest
1 голос
/ 01 мая 2019

У меня есть XSD-файл, который содержит значения для определенных элементов в XML-файле.Я хочу написать программу, которая извлекает эти значения из этого XSD-файла, чтобы я мог создать выпадающее меню из всех значений для указанных элементов.

Вот мой XSD-файл, в котором я хочу использовать каждыйиз значений, которые он предоставляет в моем приложении:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="POSSimpleTypes.xsd"/>
    <xs:complexType name="PRODUCT_STOPType">
        <xs:annotation>
            <xs:documentation>Version 1.11</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="CRUD">
                <xs:simpleType>
                    <xs:restriction base="CRUDType">
                        <xs:enumeration value="P"/>
                        <xs:enumeration value="C"/>
                        <xs:enumeration value="U"/>
                        <xs:enumeration value="D"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="SKU_CODE">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="SKUType">
                            <xs:attribute name="owner" type="CODEType" use="optional"/>
                            <xs:attribute name="owner_type" use="optional">
                                <xs:simpleType>
                                    <xs:restriction base="CONSTANTType">
                                        <xs:enumeration value="1"/>
                                        <xs:enumeration value="8"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="STOP_REASON">
                <xs:simpleType>
                    <xs:restriction base="CONSTANTType">
                        <xs:enumeration value="21001"/>
                        <xs:enumeration value="21002"/>
                        <xs:enumeration value="21003"/>
                        <xs:enumeration value="21004"/>
                        <xs:enumeration value="21005"/>
                        <xs:enumeration value="21006"/>
                        <xs:enumeration value="21007"/>
                        <xs:enumeration value="21008"/>
                        <xs:enumeration value="21009"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="LOGIN_NAME" type="NAMEType"/>
            <xs:element name="PROD_STOP_COMMENCE" type="DATEType" minOccurs="0"/>
            <xs:element name="PROD_STOP_END" type="DATEType" minOccurs="0"/>
            <xs:element name="CODE" type="LONG_CODEType" minOccurs="0"/>
            <xs:element name="ORG_UNITS">
                <xs:complexType>
                    <xs:sequence maxOccurs="unbounded">
                        <xs:element name="ORGU_CODE">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="CODEType">
                                        <xs:attribute name="type" type="NAMEType" use="required"/>
                                        <xs:attribute name="parent" type="CODEType" use="optional"/>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="docNo" type="INTEGERType" use="required"/>
    </xs:complexType>
    <xs:element name="PRODUCT_STOPType" type="PRODUCT_STOPType" />
</xs:schema>

Когда я запускаю командную строку разработчика в Visual Studio и преобразовываю файл в класс, сгенерированный файл выглядит следующим образом:

    public int STOP_REASON {
        get {
            return this.sTOP_REASONField;
        }
        set {
            this.sTOP_REASONField = value;
        }
    }

Где указаны значения в файле XSD и как их получить?

Спасибо.

1 Ответ

2 голосов
/ 02 мая 2019

Полагаю, мое предположение о том, что инструмент xsd генерирует только перечисления для значений перечисления, определенных для типов xs:string, верно. Я попробовал следующую простую XML-схему:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="MyClass">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="MyStringEnum">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="Val1" />
              <xs:enumeration value="Val2" />
              <xs:enumeration value="Val3" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="MyIntEnum">
          <xs:simpleType>
            <xs:restriction base="xs:int">
              <xs:enumeration value="2" />
              <xs:enumeration value="4" />
              <xs:enumeration value="6" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

При запуске инструмента xsd для этого создаются следующие классы:

using System.Xml.Serialization;

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class MyClass {

    private MyClassMyStringEnum myStringEnumField;

    private int myIntEnumField;

    /// <remarks/>
    public MyClassMyStringEnum MyStringEnum {
        get {
            return this.myStringEnumField;
        }
        set {
            this.myStringEnumField = value;
        }
    }

    /// <remarks/>
    public int MyIntEnum {
        get {
            return this.myIntEnumField;
        }
        set {
            this.myIntEnumField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
public enum MyClassMyStringEnum {

    /// <remarks/>
    Val1,

    /// <remarks/>
    Val2,

    /// <remarks/>
    Val3,
}

Как вы можете легко видеть, enum для элемента на основе xs:string сгенерирован, тогда как элемент на основе xs:int создается просто как тип int. Я все еще ищу документацию, чтобы подтвердить это, но результаты теста говорят сами за себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...