У меня есть простой 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 )
{...}
Как я могу убедиться, что ошибка документа обнаружена?
Спасибо!
Поскольку я не уверен, как объяснить проблему более подробно, вот что я нашел, чтобы эта проверка 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" );
Надеюсь, это поможет другим людям.
Из документации MSDN в XmlReader, раздел Проверка данных XML, таблица с XmlReaderSettings (выделение мое):
Событие ValidationEventHandler
Обработчик событий для получения информации о событиях проверки. Если обработчик события не указан, исключение XmlException генерируется при первой ошибке проверки.
Поскольку вы указываете ValidationEventHandler
, XmlReader вызывает обработчик, но не бросает его.