【问题标题】:XSD validation with XmlSchemaSet does not find error使用 XmlSchemaSet 进行 XSD 验证未发现错误
【发布时间】:2015-06-08 13:50:28
【问题描述】:

我有一个简单的 XML,我们生成以匹配供应商的 XSD,但是,文档中存在错误,我们使用 <deletePLU> 而不是 <domain:deletePLU>

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”归因于没有架构的默认命名空间?

<?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 )
        {...}

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

谢谢!

【问题讨论】:

  • 向我们展示 XSD,也许它实际上允许 deletePLU 没有命名空间?
  • XSD 是巨大的。但不,它不允许这样做,因为当使用相同的 XSD 将 XML 加载到 XML Studio 2014 中进行验证时,Xml Studio 确实按预期输出错误——“deletePLU”缺少“域”命名空间。
  • @nodots 你是对的。该标签可以在没有命名空间的情况下使用。我编辑了我的问题以包含 XSD 根目录。但问题仍然存在,为什么验证没有发现错误?
  • 我很困惑 - 它可以在没有命名空间的情况下使用,还是错误?您能否显示 XSD 中的 定义?是否在同一个 XSD 中?

标签: c# xml xsd xsd-validation


【解决方案1】:

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

ValidationEventHandler event
用于接收的事件处理程序 有关验证事件的信息。 如果事件处理程序不是 如果提供,则在第一个验证错误时引发 XmlException。

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

【讨论】:

    【解决方案2】:

    由于我不确定如何更详细地解释该问题,因此我发现此 XSD 验证按预期工作。

    按原样使用阅读器设置:

            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" );
    

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

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2012-04-13
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多