使用导入的架构编译 XmlSchemaSet

Pau*_*ner 3 c# xsd .net-core

我正在尝试创建一个XmlSchemaSet针对 SAML 2.0 的架构定义集,从此处的协议架构开始:https ://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0 .xsd

var set = new XmlSchemaSet();

XmlSchema schema;
using (var reader = XmlReader.Create(
    "https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd"))
{
    schema = XmlSchema.Read(reader, (sender, e) => Console.WriteLine(e.Message));
}

set.Add(schema);

set.Compile();
Run Code Online (Sandbox Code Playgroud)

调用时Compile,抛出以下异常:

System.Xml.Schema.XmlSchemaException
Type 'urn:oasis:names:tc:SAML:2.0:assertion:EncryptedElementType' is not declared.
   at System.Xml.Schema.XmlSchemaSet.InternalValidationCallback(Object sender, ValidationEventArgs e)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e)
   at System.Xml.Schema.Compiler.CompileElement(XmlSchemaElement xe)
   at System.Xml.Schema.Compiler.Compile()
   at System.Xml.Schema.Compiler.Execute(XmlSchemaSet schemaSet, SchemaInfo schemaCompiledInfo)
   at System.Xml.Schema.XmlSchemaSet.Compile()
   at XSD.Program.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)

指定的类型urn:oasis:names:tc:SAML:2.0:assertion:EncryptedElementType出现在架构顶部导入的命名空间中:

<import
    namespace="urn:oasis:names:tc:SAML:2.0:assertion"
    schemaLocation="saml-schema-assertion-2.0.xsd"/>
Run Code Online (Sandbox Code Playgroud)

使用 Fiddler,我看不到应用程序尝试检索导入的架构。

为什么这些导入语句似乎无法与 一起使用XmlSchemaSet

Pau*_*ner 5

默认行为XmlSchemaSet是不尝试解析任何外部模式。为此,XmlResolver必须设置该属性。首选解析器实现是XmlUrlResolver

set.XmlResolver = new XmlUrlResolver();
Run Code Online (Sandbox Code Playgroud)

重要的是在将任何模式添加到集合之前设置此属性。对架构的调用Add执行“预处理”,其中包括解析任何导入语句。分配XmlResolverafter 调用Add似乎没有效果。

应用程序代码必须是:

var set = new XmlSchemaSet
{
    // Enable resolving of external schemas.
    XmlResolver = new XmlUrlResolver()
};

XmlSchema schema;
using (var reader = XmlReader.Create(
    "https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd"))
{
    schema = XmlSchema.Read(reader, (sender, e) => Console.WriteLine(e.Message));
}

set.Add(schema);

set.Compile();
Run Code Online (Sandbox Code Playgroud)

注意由于从 w3.org 加载架构时出现问题,上述代码实际上仍然没有产生所需的结果,但是导入的 SAML 架构已成功解析。