我收到了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
答案 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);
希望这有帮助