如何在针对XSD验证XML时解决“找不到架构...”错误?
我正在使用相当复杂的第三方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文档进行了一些小修改,以使其失败,看起来它正在捕获错误。
试图为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
会处理验证过程中遇到的内联架构。
更多信息
该代码没有工作(你不能分配设置这种方式 - 这是一个只读属性),但我修改了上面的代码并使其工作。 – 2011-06-03 13:44:31
嗯...显然我没有正确地连接我的验证事件。只要我重新连接它,我会得到相同的报告错误。取出Schema.Add调用不起作用 - 相同的错误消息。 – 2011-06-03 13:53:56
看看类似的问题:[在C#中针对引用的XSD验证XML](http://*.com/questions/751511/validating-an-xml-against-referenced-xsd-in-c) – 2011-06-03 14:14:36