为什么我的XmlReader没有针对Schema进行验证?

时间:2013-12-30 23:03:48

标签: c# xml

我正在尝试读取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一定是个问题,对吗?

1 个答案:

答案 0 :(得分:1)

我同意它应该是一个路径问题。 我能够使用你的代码(和你使用的例子:))。

我通过在xml中设置我的本地文件路径,在文件中对xsd的本地副本测试了验证。

当我使用你的确切xml时它没有做任何事情,如果我更改了标签,确实抛出了验证错误。

我的xsi:schemaLocation如下所示:

xsi:schemaLocation="http://www.publishing.org C:\Users\Mike\Desktop\xml_test_files\test.xsd"

您是否尝试过简单的本地文件夹路径?