none
Как проверить XML на соответствие XSD указанным в xsi:schemaLocation? RRS feed

  • Вопрос

  • Доброго времени суток.

    Как правильно, без лишних телодвижений, проверить XML файл на соответствие XSD-схемам, указанным в теле этого XML файла?

    Например, имеется такой файл:

    <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="../../support/localization.xslt"?>
    <doc:resources xmlns:doc="http://mea-orbis.com/2012/XMLSchema/localization"
    			   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    			   xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/localization ../../support/localization.xsd">
      <!--Заголовки столбцов таблицы-->
      <doc:record id="commandName">Команда</doc:record>
      <doc:record id="commandNameDescript">Краткое описание</doc:record>
      <doc:record id="commandNameNotes">Примечание</doc:record>
      <!--******************************************-->
    
      <!--Наименования групп команд-->
      <doc:record id="group1">Команды смены кодировок</doc:record>
    
      <!--******************************************-->
    
      <!--Наименования команд, их краткое описание и примечания-->
      <doc:record id="dwgconvertName">DWGCONVERT</doc:record>
      <doc:record id="dwgconvertKeyWords">кодировка</doc:record>
      <doc:record id="dwgconvertDescr">конвертация текущего чертежа (версии AutoCAD до 2011 включительно)</doc:record>
    
      <doc:record id="dwgconvertcpName">DWGCONVERTCP</doc:record>
      <doc:record id="dwgconvertcpKeyWords">кодировка</doc:record>
      <doc:record id="dwgconvertcpDescr">конвертация текущего чертежа (версии AutoCAD с 2008)</doc:record>
    
      <doc:record id="dwgconvertfilesName">DWGCONVERTFILES</doc:record>
      <doc:record id="dwgconvertfilesKeyW">кодировка</doc:record>
      <doc:record id="dwgconvertfilesDescr">конвертация выбранных пользователем чертежей</doc:record>
    
      <doc:record id="dwgconvertstrName">DWGCONVERTSTR</doc:record>
      <doc:record id="dwgconvertstrKeyW">кодировка</doc:record>
      <doc:record id="dwgconvertstrDescr">
    	конвертация отдельного текстового примитива (примитивов)
    	из текущего чертежа
      </doc:record>
      <doc:record id="ns">DWGCONVERT</doc:record>
    
      <doc:record id="arxload">Загрузка всех ARX файлов</doc:record>
      <doc:record id="netload">Загрузка всех DLL файлов</doc:record>
    </doc:resources>
    В MSDN я нашел примеры (первый, второй), проверяющие XML на соответствие XSD, но проблема в том, что в этих примерах XSD файлы указываются дополнительно, вместо того, чтобы попросту получить нужную информацию из самого XML файла, в котором она указана посредством атрибута xsi:schemaLocation.

    Как правильно проверять XDocument на предмет его соответствия XSD схемам, указанным в атрибуте xsi:schemaLocation?

    Спасибо.

Ответы

  • Доброго времени суток. 

    Благодарю всех за ответы. Я ознакомился с предложенными вариантами, однако воспользоваться решил более простым, который уже использовал когда-то ранее - пример здесь. В указанном мною примере код более лаконичен и понятен.

    Я слегка подправил код под то, что мне нужно:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Schema;
    using System.Xml;
    using System.Xml.XPath;
    
    namespace XSDValidator
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.Schemas.Add(@"http://mea-orbis.com/2012/XMLSchema/appinfo", @"C:\MyApp\appinfo.xsd");
                    settings.ValidationType = ValidationType.Schema;
    
                    XmlReader reader = XmlReader.Create(@"C:\MyApp\appinfo.xml", settings);
                    XmlDocument document = new XmlDocument();
                    document.Load(reader);
                    ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);                
                    document.Validate(eventHandler); 
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
            }
    
            static void ValidationEventHandler(object sender, ValidationEventArgs e)
            {
                switch (e.Severity)
                {
                    case XmlSeverityType.Error:
                        Console.WriteLine("Error: {0}", e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning {0}", e.Message);
                        break;
                }
    
            }
        }
    }

    Спасибо.




Все ответы

  • Добрый день.

    А кто вам мешает, при помощи XmlDocument открыть файл с XML, считать из него нужный элемент и атрибут. А потом, зная расположение XSD проверить XML на соответствие по одному из приведенных вами примеров? Кстати, вот еще пример.

    • Предложено в качестве ответа Abolmasov Dmitry 5 мая 2012 г. 8:36
    Отвечающий
  • Никто не мешает, просто не хотелось бы изобретать велосипед на тот случай, если уже существует компактное "родное" решение для подобных случаев. За ссылку спасибо.
  • Попробуйте XmlSchemaValidator с установленным флагом ProcessSchemaLocation (он упоминается в ремарках).
    • Предложено в качестве ответа Abolmasov Dmitry 5 мая 2012 г. 8:36
    Модератор
  • Здравствуйте.

    Вы попробовали вариант, предложенный PashaPash? Если он решает проблему, то пожалуйста, отметьте сообщение как ответ. Спасибо.


    Для связи [mail]

  • Здравствуйте.

    Вы попробовали вариант, предложенный PashaPash? Если он решает проблему, то пожалуйста, отметьте сообщение как ответ. Спасибо.


    Для связи [mail]

    я ещё не успел проверить (загружен по работе). На выходных проверю и обязательно отпишусь на эту тему.
  • Добрый день,

    Вам удалось проверить предложенные решения? Или вы нашли какое-то свое, тогда было бы очень хорошо услышать его.

    Спасибо.


    Для связи [mail]

  • Доброго времени суток. 

    Благодарю всех за ответы. Я ознакомился с предложенными вариантами, однако воспользоваться решил более простым, который уже использовал когда-то ранее - пример здесь. В указанном мною примере код более лаконичен и понятен.

    Я слегка подправил код под то, что мне нужно:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Schema;
    using System.Xml;
    using System.Xml.XPath;
    
    namespace XSDValidator
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.Schemas.Add(@"http://mea-orbis.com/2012/XMLSchema/appinfo", @"C:\MyApp\appinfo.xsd");
                    settings.ValidationType = ValidationType.Schema;
    
                    XmlReader reader = XmlReader.Create(@"C:\MyApp\appinfo.xml", settings);
                    XmlDocument document = new XmlDocument();
                    document.Load(reader);
                    ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);                
                    document.Validate(eventHandler); 
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
            }
    
            static void ValidationEventHandler(object sender, ValidationEventArgs e)
            {
                switch (e.Severity)
                {
                    case XmlSeverityType.Error:
                        Console.WriteLine("Error: {0}", e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning {0}", e.Message);
                        break;
                }
    
            }
        }
    }

    Спасибо.