使用xsd.exe创建包含模式的类对象

时间:2011-08-19 13:40:53

标签: c# xml xsd xsd.exe

我收到了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>

当我使用此命令创建c#对象类时:

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

然后它创建了一个名为:

的对象

MainSchema_Common.cs

当我针对此Schema验证对象时,它会出现异常:

{“类型'http://schemas.domain.com:SSN'未声明,或者不是简单类型。”}

有谁知道我做错了什么?

请注意,我从外部来源收到了这个XSD架构,并且我被告知此文件中没有错误。

诚恳 AGH

1 个答案:

答案 0 :(得分:1)

您需要解释您的验证方式。我假设您正在创建该类的实例,然后序列化为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); 

希望这有帮助