【发布时间】:2013-02-05 17:36:54
【问题描述】:
我有两个 xml 架构:
1) 基础设施Root.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)datatypes-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" 不同并且会破坏验证。有人可以帮我解决吗?
【问题讨论】:
-
首先删除
try {...} catch {}。你可能正在吃(隐藏)Exception。 -
另外,你为什么使用
XmlTextReader?为什么不直接使用路径,或者更糟糕的是,使用StreamReader。new XmlTextReader()自 .NET 2.0 起已被弃用。 -
那里会出现异常,“schemaSet.Add(null, schemaReader)”调用会抛出。
-
XmlTextReader 来自旧代码示例。
标签: c# xml-serialization xsd xmlschemaset