c# – 使用包含的XSD

这是一个XSD:

<?xml version="1.0"?>
<xsd:schema 
elementFormDefault='unqualified' 
attributeFormDefault='unqualified' 
xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
>

  <xsd:simpleType name='TheSimpleType'>
    <xsd:restriction base='xsd:string' />
  </xsd:simpleType>
</xsd:schema>

这是第二个XSD,其中包括上述内容:

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema 
elementFormDefault='unqualified' 
attributeFormDefault='unqualified' 
xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
targetNamespace='a'
xmlns='a'
>

  <xsd:include schemaLocation='Include.xsd' />

  <xsd:element name = "TheElement" >
  <xsd:complexType>
  <xsd:attribute name="Code" type="TheSimpleType" use="required"/>
  </xsd:complexType>
  </xsd:element>
</xsd:schema>

我需要将(第二)XSD读入C#,并且:

检查它是否是一个有效的XSD,和
>验证文件.

这里有一些C#在模式中阅读:

    XmlSchemaSet schemaSet = new XmlSchemaSet();
    foreach (string sd in Schemas)
    {
        using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open)))
        {
            schemaSet.Add(XmlSchema.Read(r, null));
        }
    }
    schemaSet.CompilationSettings = new XmlSchemaCompilationSettings();
    schemaSet.Compile();

.Compile()失败,因为“Type”a:TheSimpleType“未声明,或不是简单类型.”

但是,如果可以:

>从模式中删除命名空间,或者
>将命名空间添加到include中.

问题是:如何在不编辑模式的情况下让C#接受它?

我怀疑问题是,虽然我已经把这两个模式都放在了XmlSchemaSet中,但是我仍然需要告诉C#,其中一个被包含在另一个中,也就是说,它并没有为它自己做好准备.实际上,如果我只告诉XmlSchemaSet关于主XSD(而不是include)(没有(或与)命名空间)),那么“Type”TheSimpleType“不被声明,或者不是一个简单的类型.

因此,这似乎是一个解决问题的包括:怎么样?

问题是如何打开模式来读取行:

XmlReader.Create(new FileStream(sd, FileMode.Open)

我必须先编写自己的XmlResolver,然后才能看到include文件的路径是如何被解析的:它来自可执行文件的目录,而不是从父模式的目录中.问题是父模式没有得到它的BaseURI集合.以下是必须打开模式的方式:

XmlReader.Create(new FileStream(pathname, FileMode.Open, FileAccess.Read),null, pathname)
翻译自:http://stackoverflow.com/questions/10128573/using-xsds-with-includes

转载注明原文:c# – 使用包含的XSD