例如,我有两个Xml模式:
a.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="test" targetNamespace="test">
<xsd:include schemaLocation="b.xsd" />
</xsd:schema>`
b.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="testType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="test"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="test" type="testType"/>
</xsd:schema>
第二个架构没有targetNamespace,并用作变色龙架构。
我正在尝试使用XmlSchemaSet:预加载这些架构
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, @"a.xsd");
foreach (XmlSchema schema in schemaSet.Schemas()) // foreach is used to simplify the example
{
Console.WriteLine("Target namespace: "schema.TargetNamespace); // "Target namespace: test"
XmlSchemaInclude include = (XmlSchemaInclude)schema.Includes[0];
Console.WriteLine("Include target namespace: " + include.Schema.TargetNamespace); // "Include target namespace: test"
}
但在我这样做之后,两个模式都有"测试"目标命名空间。我希望实例化的模式对象应该等于源模式,但对于模式"b.xsd"来说不是这样。为什么它会这样做,有没有办法禁用这种行为?
当你从a.xsd中包含b.xsd时,你实际上是在说你希望b.xsd与a.xsd具有相同的目标命名空间。术语变色龙包含表示实现这一点的过程,给定一个没有目标命名空间规范的模式文档(如b.xsd)。
如果希望b.xsd中声明的test
元素和testType
类型不在命名空间test
中,则不希望将b.xsd用作变色龙,并且不应包含a.xsd中的b.xsd。您可能希望使用xs:import。
但也许我不明白你在追求什么。