XSD 使用 XmlSchemaSet 验证未发现错误

XSD validation with XmlSchemaSet does not find error

我有一个简单的 XML,我们生产它来匹配供应商的 XSD,但是,文档中有一个错误,我们使用 <deletePLU> 而不是 [=15] =].

XSD 使用目标命名空间:

<xs:schema xmlns:domain="urn:vfi-sapphire:np.domain.2001-07-01"
           elementFormDefault="unqualified"
           targetNamespace="urn:vfi-sapphire:np.domain.2001-07-01"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="PLUs"> ...

代码不接受那个,我不知道为什么。

我假设缺少域名称空间 "deletePLU" 归因于没有架构的 defautl 名称空间?

<?xml version="1.0"?>
<domain:PLUs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:domain="urn:vfi-sapphire:np.domain.2001-07-01" page="1" ofPages="1">
     <domain:PLU>
        <upc>00853288005119</upc>
        <upcModifier>0</upcModifier>
        <description>SIX PACKS</description>
        <department>2</department>
        <fee>0</fee>
        <pcode>0</pcode>
        <price>10.19</price>
        <taxRates>
           <domain:taxRate sysid="2"/> 
        </taxRates>
        <idChecks>
           <domain:idCheck sysid="2"/> 
        </idChecks>
        <SellUnit>1.000</SellUnit> 
     </domain:PLU>
     <deletePLU>
        <upc>00751249241128</upc>
        <upcModifier>0</upcModifier>
     </deletePLU>
<domain:PLUs>

验证码如下: (在将验证重写为此之前,我确实使用了 XDocument 和 XmlSchemaSet,但都没有用)

        // configure the xmlreader validation to use inline schema.
        var config = new XmlReaderSettings { ValidationType = ValidationType.Schema };
        config.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        config.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        config.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;

        var b = new StringBuilder();
        config.ValidationEventHandler += ( sender, vea ) =>
        {
          ...
        };

        config.Schemas = schemas;

        try
        {
            // Get the XmlReader object with the configured settings.
            var reader = XmlReader.Create( xmlDocFile.FullName, config );

            // Parsing the file will cause the validation to occur.
            while ( reader.Read() );

        }
        catch ( Exception e )
        {...}

如何确保文档的错误被发现?

谢谢!

来自 MSDN documentation on XmlReader, section Validating XML data, table with XmlReaderSettings(强调我的):

ValidationEventHandler event
An event handler for receiving information about validation events. If an event handler is not provided, an XmlException is thrown on the first validation error.

由于您指定了 ValidationEventHandler,XmlReader 会调用处理程序但不会抛出。

因为我不确定如何更详细地解释这个问题,所以我发现 XSD 验证可以按预期工作。

像以前一样使用 reader 设置:

        var config = new XmlReaderSettings
        {
            ValidationType = ValidationType.Schema,
            ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings,
            DtdProcessing = DtdProcessing.Ignore,
            ConformanceLevel = ConformanceLevel.Document
        };

        config.ValidationEventHandler += ConfigOnValidationEventHandler;

        config.Schemas = schemas;

重要的是您不要指定 targetNamespace。我使用了重载 XmlShemaSet.Add(string targetNamespace, string schemaUri).

schemas.Add( null, "c:\test\mySchema.xsd" );

我希望这对其他人有帮助。