gpt4 book ai didi

c# - 如何在针对 XSD 验证 XML 时修复 "Could not find schema..."错误?

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:12 25 4
gpt4 key购买 nike

我正在使用一种相当复杂的第三方 XSD 格式 - XSD 指代另一个 XSD 中的类型,而后者又指代另一个 XSD 中的类型。我需要能够根据这种格式验证 XML。我已经能够使用 XML Spy 对此进行验证,但现在我们需要一种更加自动化的方法。

我正在使用此代码的稍微复杂的版本加载 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 将处理验证期间遇到的内联模式。


更多信息

关于c# - 如何在针对 XSD 验证 XML 时修复 "Could not find schema..."错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6227447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com