我收到了 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
当我根据这个模式验证一个对象时,它出现了一个异常:
{“类型‘http://schemas.domain.com:SSN’未声明,或者不是简单类型。”
有人知道我做错了什么吗?
请记住,我从外部来源收到了此 XSD 架构,并被告知此文件中没有错误。
真诚的 啊
最佳答案
您需要解释您是如何验证的。我假设您正在创建该类的一个实例,然后序列化为 XML,而 xml 未验证?
您需要注意,仅仅因为您的 xml 是序列化使用 xsd.exe 派生的类型的产物并不自动意味着 xml 将符合架构。
您可能需要通过为根命名空间或文档中的其他节点注入(inject)覆盖来启动 XmlSerializer。
例如在某个节点注入(inject)命名空间:
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);
调用序列化器:
XmlSerializer serializer = new XmlSerializer(typeof(MyType), overrides);
希望对你有帮助
关于c# - 使用 xsd.exe 创建包含模式的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122425/