Проверка XSD с помощью XmlSchemaSet не находит ошибку

1

У меня есть простой 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" присваивается пространству имен 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 )
        {...}

Как я могу убедиться, что ошибка документа обнаружена?

Спасибо!

  • 1
    Покажите нам XSD, может быть, он на самом деле позволяет deletePLU без пространства имен?
  • 0
    XSD гигантский. Но нет, это не допускает этого, поскольку при загрузке XML в XML Studio 2014 с использованием того же XSD для его проверки Xml Studio выдает ошибку, как и ожидалось - «deletePLU» отсутствует пространство имен «домен».
Показать ещё 2 комментария
Теги:
xsd
xsd-validation

2 ответа

0
Лучший ответ

Поскольку я не уверен, как объяснить проблему более подробно, вот что я нашел, чтобы эта проверка 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" );

Надеюсь, это поможет другим людям.

0

Из документации MSDN в XmlReader, раздел Проверка данных XML, таблица с XmlReaderSettings (выделение мое):

Событие ValidationEventHandler
Обработчик событий для получения информации о событиях проверки. Если обработчик события не указан, исключение XmlException генерируется при первой ошибке проверки.

Поскольку вы указываете ValidationEventHandler, XmlReader вызывает обработчик, но не бросает его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню