2011-06-03 79 views
1

我正在使用相当复杂的第三方XSD格式 - XSD引用另一个XSD中的类型,它指向另一个XSD中的类型。我需要能够验证这种格式的XML。我已经能够使用XML Spy来验证这一点,但现在我们需要一种更加自动化的方法。如何在针对XSD验证XML时解决“找不到架构...”错误?

我使用此代码的一个稍微复杂一点的版本装载的XSD,但他们是等价的(只要我还没有作出任何错别字):

string xmlFile = @"C:\tmp\testxml\Valid.xml"; 
string xsdFile = @"C:\tmp\testxml\DRO.xsd"; 

var schema = new XmlSchemaCollection(); 
var reader = new FileStream(xmlFile, FileMode.Open); 
var validating = new XmlValidatingReader(reader, XmlNodeType.Element, null); 

// Removed 3 other XSDs to simplify a bit, but are included in the real code 
schema.Add("http://www.test.com/PTS/Formdom", @"C:\tmp\textxml\Formdom.xsd"); 
schema.Add("http://www.test.com/PTS/DRO", @"C:\tmp\textxml\DRO.xsd"); 

validating.ValidationType = ValidationType.Schema; 
validating.ValidationEventHandler += validating_ValidationEventHandler; 

while (validating.Read()) {} 

// More code removed 

的XML文件是这样的 -

<?xml version="1.0" encoding="UTF-8" ?> 
<dro:DRO 
xmlns:dro="http://www.test.com/PTS/DRO" 
xmlns:for="http://www.test.com/PTS/Formdom" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.test.com/PTS/DRO" > 

    <dro:HeaderSection> 
     <dro:VersionNumber>1.2</dor:VersionNumber> 
    </dro:HeaderSection> 
</dro:DRO> 

的DRO.XSD看起来像这样(再次,重下调):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="http://www.test.com/PTS/DRO" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:FF="http://www.test.com/PTS/FormFields" 
xmlns:CD="http://www.test.com/PTS/Formdom" 
xmlns:CF="http://www.test.com/PTS/CommonFields" 
targetNamespace="http://www.test.com/PTS/DRO" 
elementFormDefault="qualified" attributeFormDefault="unqualified"> 
<xs:import namespace="http://www.test.com/PTS/FormFields" schemaLocation="FormFields.xsd"/> 
<xs:import namespace="http://www.test.com/PTS/Formdom" schemaLocation="FormDom.xsd"/> 
<xs:import namespace="http://www.test.com/PTS/CommonFields" schemaLocation="CommonFields.xsd"/> 
<xs:element name="DRO"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="HeaderSection" type="HeaderSection"/> 
     </xs:sequence> 
    </xs:complexType> 
那里发生的第一个错误,我修剪它一路下滑只是部分

我假设错误位于如何配置xmlns和targetNamespace的东西,我确定它们完全匹配(甚至情况相同)。我还确保,当我在C#中添加模式时,目标名称空间匹配。在上面显示的代码中,我手动设置了名称,但在实际代码中,我从XSD中提取了targetNamespace并使用它。

当我运行的代码,我可以成功地添加所有的XSD的,但是一旦它开始读取XML文件,它失败,这些错误:

无法找到元素 “HTTP架构信息: //www.test.com/PTS/DRO:DRO' 找不到元素的模式信息 'http://www.test.com/PTS/DRO:HeaderSection'

(加上一吨其他类似的错误)

我只是没有看到我需要做什么使这项工作。有任何想法吗?

编辑:我又回到了这个代码,并意识到我实际上没有做任何与我的模式。我将它们添加到XmlSchemaCollection中,但我没有将它附加到任何内容。我修改为使用XmlReaderSettings代码()类,然后添加架构到它的架构集合:

var settings = new XmlReaderSettings(); 
// Code removed 
settings.Schema.Add("http://www.test.com/PTS/Formdom", @"C:\tmp\textxml\Formdom.xsd"); 
// Code removed 
var validating = XmlReader.Create(reader, settings); 

这看起来像它的实际工作(!耶)。我对XML文档进行了一些小修改,以使其失败,看起来它正在捕获错误。

回答

2

试图为XmlValidatingReader.Settings

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.Schema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 

validating.Settings = settings; 

schema.Add()在这种情况下,不需要添加这些设置,为XmlSchemaValidationFlags.ProcessInlineSchema会处理验证过程中遇到的内联架构。


更多信息

+0

该代码没有工作(你不能分配设置这种方式 - 这是一个只读属性),但我修改了上面的代码并使其工作。 – 2011-06-03 13:44:31

+0

嗯...显然我没有正确地连接我的验证事件。只要我重新连接它,我会得到相同的报告错误。取出Schema.Add调用不起作用 - 相同的错误消息。 – 2011-06-03 13:53:56

+0

看看类似的问题:[在C#中针对引用的XSD验证XML](http://stackoverflow.com/questions/751511/validating-an-xml-against-referenced-xsd-in-c) – 2011-06-03 14:14:36