XML проверка XSD. Когда это происходит - PullRequest
0 голосов
/ 30 апреля 2020

Я не могу понять, когда проверка 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
        }

Я ожидаю, что проверка произойдет в строке do c .Validate (eventHandler); Однако это всегда происходит в do c .Load (читатель); . У меня есть исключение, если что-то не так с 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."

И это код из примера Microsoft https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmldocument.validate?view=netcore-3.1

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

Это на самом деле то же самое. Но обратите внимание на комментарий // следующий вызов Validate завершается успешно. . Они также ожидают получить подтверждение в строке document.Validate (eventHandler);

Что происходит.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Когда ваш блок кода устанавливает объект settings, он устанавливает схему и Валидатор для использования ValidationType.Schema (то есть: использует схему).

Когда вы настройте XmlReader, используя ваш settings, он также настроен для проверки в соответствии со схемой, что вызывает основанную на схеме ошибку / исключение.

Вызов document.Validate(eventHandler); полностью избыточен, поскольку это будет успешным при любых обстоятельствах - потому что xml уже подтвержден. Комментарий правильный: «следующий вызов Validate завершился успешно», поскольку документ уже был подтвержден.

0 голосов
/ 30 апреля 2020

Я подозреваю, что вы не можете различить guish между XML, который правильно сформирован и XML, который действителен .

Правильно оформленный документ XML удовлетворяет всем правилам спецификации XML. Если это не так, вы должны получить ошибку корректности любого парсера XML.

Если вы также решите

a) предоставить XSD, который описывает вас XML document и

b) скажите вашему XML процессору выполнить проверку на соответствие этому XSD

, тогда процессор XML также проверит соответствие документа правила в схеме XML (схема XML состоит из одного или нескольких XSD).

Если вы все еще не уверены, отредактируйте свой вопрос и предоставьте сообщения об ошибках, которые вы видя. Вам не нужно включать какую-либо конфиденциальную информацию - достаточно шаблона ошибки, чтобы определить тип ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...