我有两个 xml 架构:
1)infrastructureRoot.xsd:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mif="urn:hl7-org:v3/mif"
xmlns:v3="urn:hl7-org:v3"
xmlns:ex="urn:hl7-org/v3-example"
xmlns="urn:hl7-org:v3"
targetNamespace="urn:hl7-org:v3"
elementFormDefault="unqualified">
<xs:include schemaLocation="datatypes-base.xsd"/>
<xs:group name="InfrastructureRootElements">
<xs:sequence>
<xs:element name="realmCode"
type="Norwegian_customer"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="InfrastructureRootAttributes"/>
</xs:schema>
2) 数据类型-base.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:sch="http://www.ascc.net/xml/schematron"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
<xs:complexType name="customer">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Norwegian_customer">
<xs:complexContent>
<xs:restriction base="customer">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="country"
type="xs:string"
fixed="Norway"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
我使用以下 C# 代码加载包含所有内容的根架构:
Func<XmlReader> xmlReaderFactory = () =>
{
XmlReaderSettings schemaReaderSettings = new XmlReaderSettings{ DtdProcessing = DtdProcessing.Parse};
XmlTextReader reader = new XmlTextReader(@"InfrastructureRoot.xsd");
return XmlReader.Create(reader, schemaReaderSettings);
};
XmlSchema xsd = XmlSchema.Read(xmlReaderFactory(), (sender, eventArgs) => {});
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.ValidationEventHandler += (sender, eventArgs) => Console.WriteLine(eventArgs.Message + " " + eventArgs.Severity);
try
{
try
{
XmlReaderSettings schemaReaderSettings = new XmlReaderSettings {DtdProcessing = DtdProcessing.Parse};
XmlReader schemaReader = XmlReader.Create(new DummyReader(), schemaReaderSettings);
schemaSet.Add(null, schemaReader);
}
catch
{
// the only thing this code is needed is to set ProhibitDTD to false
// there is no acceptable public way to do that
}
schemaSet.Add(xsd);
schemaSet.Compile();
XmlSchemaInclude external = ((XmlSchemaInclude)xsd.Includes[0]);
String targetNamespace = external.Schema.TargetNamespace;
Debug.Assert(targetNamespace == null);
}
catch{}
执行后 "targetNamespace" 的值等于 "urn:hl7-org:v3" ,这与原始模式 "datatypes-base.xsd" 不同并破坏了验证。有人可以帮我解决吗?