Полная проверка XML-схемы

тот, который я сохранил в feeddemon для меня для проверки больше, когда у меня есть время (когда это для программиста? LOL), ниже

ExifTagCollection - библиотека извлечения Метаданных EXIF

Mike

5
задан Jim McKeeth 18 October 2009 в 04:12
поделиться

5 ответов

Я часто использую XMLNotepad . (Не знаю, пробовали ли вы это уже.)

Это бесплатно и хорошо помогает сообщать о множестве ошибок одновременно, при условии, что они независимы, а не терминалы! Примерно так же, как ошибки компилятора в Delphi: если он запустился по ложному пути, все последующее часто оказывается бессмысленным.

В любом случае, у меня очень хорошо сработала проверка по довольно запутанным схемам вроде TVB 3.2 ...

3
ответ дан 14 December 2019 в 04:42
поделиться

Проблема заключается в том, что XML-схема определяет язык вашего XML-документа. Затем валидатор просто пытается «скомпилировать» ваш XML-документ с использованием спецификации этого языка.

Для большинства компиляторов с фиксированными языками (например, Delphi или C #) потребовалось довольно много времени, чтобы стать достаточно расслабленным, чтобы сообщить более чем об одной ошибке.

XML-схемы больше похожи на динамический язык, поэтому я считаю, что Поставщикам инструментов проверки потребуется еще больше времени, чтобы заставить их расслабиться и сообщить о более чем одной ошибке или продолжить работу после первой ошибки.

Я не уверен, что какие-либо продукты делают это, но есть несколько патентов, поданных на вещи, которые может сделать это: http://www.faqs.org/patents/app/20080228810 и http://www.faqs.org/patents/app/20080229292

Обратите внимание, что у них подана в 2008 году!

2
ответ дан 14 December 2019 в 04:42
поделиться

Этот код на C # должен делать именно это - он будет сканировать весь XML и проверять его на соответствие предоставленному XSD, и он будет выплевывать все ошибки проверки (или ошибки в схеме тоже! ) как они случаются. Надеюсь, это поможет!

То, как вы его используете:

MyXmlValidator (name of XML file) (name of XSD file)

Вот и все, что есть!

Марк


    static void Main(string[] args)
    {
        ShowTitle();

        if(args.Length < 2)
        {
            ShowUsage();
            return;
        }

        string xmlFileName = args[0];
        string xsdFileName = args[1];

        if(!File.Exists(xmlFileName))
        {
            ShowError(string.Format("XML File '{0}' does not exist)", xmlFileName));
            return;
        }

        if (!File.Exists(xsdFileName))
        {
            ShowError(string.Format("XSD schema '{0}' does not exist)", xsdFileName));
            return;
        }

        StreamReader xsdReader = new StreamReader(xsdFileName); 

        XmlSchema Schema = new XmlSchema();
        Schema = XmlSchema.Read(xsdReader, new ValidationEventHandler(XSDValidationEventHandler));

        XmlReaderSettings ReaderSettings = new XmlReaderSettings();    
        ReaderSettings.ValidationType = ValidationType.Schema;                
        ReaderSettings.Schemas.Add(Schema);   

        ReaderSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler);

        XmlTextReader xmlReader = new XmlTextReader(xmlFileName);
        XmlReader objXmlReader = XmlReader.Create(xmlReader, ReaderSettings);

        while (objXmlReader.Read())
        {   }

        Console.WriteLine("Successful validation completed!");
    }

    private static void XSDValidationEventHandler(object sender, ValidationEventArgs e)
    {
        Console.WriteLine("Error reading XSD: " + e.Message);
    }

    private static void XMLValidationEventHandler(object sender, ValidationEventArgs e)
    {
        Console.WriteLine("Validation error: " + e.Message);
    }

    private static void ShowError(string message)
    {
        Console.WriteLine("ERROR: " + message);
    }

    private static void ShowUsage()
    {
        Console.WriteLine("USAGE: GaraioXmlValidator (name of XML file) (name of XSD file)" + Environment.NewLine);
    }

    private static void ShowTitle()
    {
        Console.WriteLine("GaraioXmlValidator v1.0 (c) 2008 by Garaio Technology Lab" + Environment.NewLine);
    }
2
ответ дан 14 December 2019 в 04:42
поделиться

Я думаю, проблема в том, что если схема недействительна по какой-либо одной причине, все последующее становится ненадежным, поэтому любые дальнейшие сбои проверки могут вводить в заблуждение. Необходимость выполнения проверки помимо «действителен ли этот документ», возможно, слишком узкоспециализированная, чтобы привлекать интерес компаний, производящих инструменты.

С точки зрения валидатора для подавляющего большинства случаев, когда он будет использоваться, нет смысла продолжать проверку при обнаружении сбоя. Документ не может стать более недействительным, чем он есть, и не может быть обнаружен как действительный после того, как он был признан недействительным.

Возможно, было бы полезно понять, почему вы хотите это сделать?

например

1
ответ дан 14 December 2019 в 04:42
поделиться

Я обнаружил, что редактор OxygenXML неплохо работает работа этого тоже. Это коммерческий редактор, но проверка выполняется с помощью механизма Xerces для проверки (с возможностью использования других). Я пробовал Xerces раньше, и не смог заставить его сообщить после первого ошибка, но они говорят, что заставляют продолжать сообщать. Это действительно хорошая работа.

XMLSpy официально не поддерживает это. Основываясь на том, что я видел в двух редакторах, мне нравится OxygenXML намного больше, чем XMLSpy, и не только из-за этой функции (что действительно приятно, поскольку она это делает).

0
ответ дан 14 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: