Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML XSD验证。当它发生时_C#_Xml_Xsd - Fatal编程技术网

C# XML XSD验证。当它发生时

C# XML XSD验证。当它发生时,c#,xml,xsd,C#,Xml,Xsd,我无法理解何时在加载或验证时进行XML验证。下面是下面的代码 XmlDocument doc = null; try { XmlReaderSettings settings = new XmlReaderSettings( ); settings.Schemas.Add("http://xxx/customs/DealFile/Common/ReleaseGoodsMessage",

我无法理解何时在加载或验证时进行XML验证。下面是下面的代码

        XmlDocument doc = null;
        try
        {

            XmlReaderSettings settings = new XmlReaderSettings( );
            settings.Schemas.Add("http://xxx/customs/DealFile/Common/ReleaseGoodsMessage",
                                 ConfigurationManager.AppSettings.Get("Schemas"));
            settings.ValidationType = ValidationType.Schema;


            using (XmlReader reader = XmlReader.Create(path, settings)) {
                doc = new XmlDocument( );
                doc.Load(reader);
            }                

            ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);

            doc.Validate(eventHandler);

        }
        catch(XmlSchemaException xmlErr)
        {
               // Do something
        }
我希望在doc.Validate(eventHandler)行上进行验证; 但是,它总是发生在doc.Load(reader)。如果XML有问题,我有一个例外

        XMLHelpers.LoadXML(@"C:\work\Xml2Db\Xml2Db\Data\Tests\BadData\01.xml")
    Exception thrown: 'System.Xml.Schema.XmlSchemaValidationException' in System.Xml.dll
    xmlErr.Message
    "The 'http://xxx/customs/DealFile/Common/ReleaseGoodsMessage:governmentProcedureType' element is invalid - 
The value 'a' is invalid according to its datatype 'Int' - The string 'a' is not a valid Int32 value."
这是微软例子中的代码

其实是一样的。 但是,请注意注释//以下验证调用成功。他们还希望在行文档上得到验证


发生了什么。

我怀疑您没有区分格式良好的XML和有效的XML

格式良好的XML文档满足XML规范的所有规则。如果没有,您应该从任何XML解析器中得到一个格式良好的错误

如果你也选择

a) 提供一个描述XML文档和

b) 告诉XML处理器根据该XSD进行验证

然后,XML处理器还将检查文档是否满足XML模式中的规则(XML模式由一个或多个XSD组成)


如果您仍然不确定,请编辑您的问题并提供您看到的错误消息。您不需要包含任何机密信息-错误模板足以告诉您它是哪种错误。

当您的代码块设置
设置
对象时,它会设置一个模式和验证器以使用
验证类型.schema
(即:使用模式)

在设置
XmlReader
时,使用
设置
也会根据架构进行验证,这会导致基于架构的错误/异常


调用
document.Validate(eventHandler)
是完全冗余的,因为它在所有情况下都会成功—因为xml已经过验证。“以下验证调用成功”的注释是正确的,因为该文档已被证明是有效的。

能否包含触发此行为的XML?抱歉,我不能。这是高度机密的。@AlbertLyubarsky是什么阻止了用无害数据替换可信数据的?在我阅读Microsoft页面时,您可以通过在设置中不指定架构来轻松避免
Create()
期间的验证。显然,
Validate()
执行验证,但您似乎认为,这是获得验证的唯一方法,创建示例与此假设相矛盾。不,情况并非如此。我添加了一个例外以使其更加清楚。
       try
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
        settings.ValidationType = ValidationType.Schema;

        XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
        XmlDocument document = new XmlDocument();
        document.Load(reader);

        ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);

        // the following call to Validate succeeds.
        document.Validate(eventHandler);
        ...