我正在尝试读取XML文件并根据该文件指定的架构进行验证。我不会提前知道架构的位置,所以我需要使用xml文件指定的架构。
以下是相关代码(受this answer启发):
var settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationFailed);
//settings.Schemas.Add("http://www.publishing.org", new XmlTextReader(@"C:\path\to\schema\Book.xsd"));
validatingReader = XmlReader.Create(xmlInputReader, settings);
while (validatingReader.Read()) ;
如果我取消注释settings.Schemas.Add
行并对settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation
发表评论,那么一切正常。我还针对外部验证器测试了模式和XML。
事件处理程序消息报告“无法加载命名空间的模式”http://www.publishing.org“ - 指定的参数超出了有效值的范围。参数名称:baseUri。”它出现在第2行(在根元素处),后跟“无法找到元素'http://www.publishing.org:[each元素的架构信息''。
我的第一个想法(而且我唯一知道它可能是)是URI没有指向xsd,但我使用了1)通过file:/// C:\ path的完整路径\ to \ schema \ Book.xsd,2)相对于xml文件的URI,以及3)相对于应用程序当前目录的URI。 Visual Studio XML编辑器对这些中的任何一个都没有问题,但XmlReader似乎无法找到它们中的任何一个。
这是一个简单的模式和一个xml实例(我的实际模式更复杂,但也失败了):
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org"
version="1.0" elementFormDefault="qualified">
<xsd:element name="Book" type="BookType"/>
<xsd:complexType name="BookType">
<xsd:sequence>
<xsd:element name="Title" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="Author" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="Date" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="ISBN" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="Publisher" type="xsd:string" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<Book xmlns="http://www.publishing.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.publishing.org ../etc/Book.xsd">
<!-- Book.xsd file:///C:\path\to\schema\Book.xsd -->
<Title>Historic Doubts Relative to Napoleon Bonaparte</Title>
<Author>Richard Whately</Author>
<Author>Whately, Richard</Author>
<Date>1849</Date>
<ISBN>1465554777</ISBN>
<Publisher>Warren P. Draper</Publisher>
</Book>
我认为关于命名空间的一切都是正确的。我也试过通过XmlDocument加载,但我得到了相同的结果。找到XSD一定是个问题,对吗?
答案 0 :(得分:1)
我同意它应该是一个路径问题。 我能够使用你的代码(和你使用的例子:))。
我通过在xml中设置我的本地文件路径,在文件中对xsd的本地副本测试了验证。
当我使用你的确切xml时它没有做任何事情,如果我更改了标签,确实抛出了验证错误。
我的xsi:schemaLocation如下所示:
xsi:schemaLocation="http://www.publishing.org C:\Users\Mike\Desktop\xml_test_files\test.xsd"
您是否尝试过简单的本地文件夹路径?