создание объекта класса с включенной схемой с использованием xsd.exe - PullRequest
2 голосов
/ 19 августа 2011

Я получил схему XSD MainSchema.XSD, а также схему Common.Xsd.

В MainSchema.xsd у меня есть следующая строка:

<xs:include schemaLocation="Common.xsd"/>

И Common.Xsd содержитопределение для различных типов данных, таких как:

<xs:simpleType name="SSN">
    <xs:annotation>
        <xs:documentation>Social security number is 10 digits</xs:documentation>
        <xs:appinfo>
            <altova:exampleValues>
                <altova:example value="5412983209"/>
                <altova:example value=""/>
            </altova:exampleValues>
        </xs:appinfo>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:whiteSpace value="collapse"/>
        <xs:pattern value="([0-9]{10})?"/>
    </xs:restriction>
</xs:simpleType>

и в MainSchema у меня есть свойство с именем SSNField типа SSN:

<xs:attribute name="CompanySSN" type="SSN">
    <xs:annotation>
        <xs:documentation>SSN number of Company</xs:documentation>
    </xs:annotation>
</xs:attribute>

Когда я создаю объектный класс ac # с помощью этой команды:

xsd.exe -c -l: c # MainSchema.xsd Common.Xsd

затем он создал объект с именем:

MainSchema_Common.cs

Когда я проверяю объект по этой схеме, возникает исключение:

{"Тип" http://schemas.domain.com:SSN' не объявлен или не являетсяпростой тип. "}

Кто-нибудь знает, что я делаю неправильно?

Имейте в виду, что я получил эти схемы XSD из внешнего источника, и мне сказали, что там былив этих файлах нет ошибок.

Sincerly agh

1 Ответ

1 голос
/ 19 августа 2011

Вам нужно объяснить, как вы проверяете.Я предполагаю, что вы создаете экземпляр класса, а затем сериализуете в XML, а XML не проверяет?

Вам нужно знать, что только потому, что ваш XML является продуктом сериализации типа, полученного с использованием xsd.exe не означает автоматически, что xml будет совместим со схемой.

Вам может потребоваться заправить XmlSerializer, введя переопределение для корневого пространства имен или других узлов в документе.

Например, чтобы вставить пространство имен в определенный узел:

XmlAttributeOverrides overrides = new XmlAttributeOverrides();

var elementAttribute = new XmlElementAttribute(typeof(SSN))
{
    ElementName = "SSN", 
    Namespace = "http://schemas.domain.com:SSN"
};

var newAttribute = new XmlAttributes();
newAttribute.XmlElements.Add(elementAttribute);
overrides.Add(typeof(ParentNodeType), "SSN", newAttribute);

Чтобы вызвать serilaizer:

XmlSerializer serializer = new XmlSerializer(typeof(MyType), overrides); 

Надеюсь, это поможет

...