тот, который я сохранил в feeddemon для меня для проверки больше, когда у меня есть время (когда это для программиста? LOL), ниже
ExifTagCollection - библиотека извлечения Метаданных EXIF
Mike
Я часто использую XMLNotepad . (Не знаю, пробовали ли вы это уже.)
Это бесплатно и хорошо помогает сообщать о множестве ошибок одновременно, при условии, что они независимы, а не терминалы! Примерно так же, как ошибки компилятора в Delphi: если он запустился по ложному пути, все последующее часто оказывается бессмысленным.
В любом случае, у меня очень хорошо сработала проверка по довольно запутанным схемам вроде TVB 3.2 ...
Проблема заключается в том, что XML-схема определяет язык вашего XML-документа. Затем валидатор просто пытается «скомпилировать» ваш XML-документ с использованием спецификации этого языка.
Для большинства компиляторов с фиксированными языками (например, Delphi или C #) потребовалось довольно много времени, чтобы стать достаточно расслабленным, чтобы сообщить более чем об одной ошибке.
XML-схемы больше похожи на динамический язык, поэтому я считаю, что Поставщикам инструментов проверки потребуется еще больше времени, чтобы заставить их расслабиться и сообщить о более чем одной ошибке или продолжить работу после первой ошибки.
Я не уверен, что какие-либо продукты делают это, но есть несколько патентов, поданных на вещи, которые может сделать это: http://www.faqs.org/patents/app/20080228810 и http://www.faqs.org/patents/app/20080229292
Обратите внимание, что у них подана в 2008 году!
Этот код на 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);
}
Я думаю, проблема в том, что если схема недействительна по какой-либо одной причине, все последующее становится ненадежным, поэтому любые дальнейшие сбои проверки могут вводить в заблуждение. Необходимость выполнения проверки помимо «действителен ли этот документ», возможно, слишком узкоспециализированная, чтобы привлекать интерес компаний, производящих инструменты.
С точки зрения валидатора для подавляющего большинства случаев, когда он будет использоваться, нет смысла продолжать проверку при обнаружении сбоя. Документ не может стать более недействительным, чем он есть, и не может быть обнаружен как действительный после того, как он был признан недействительным.
Возможно, было бы полезно понять, почему вы хотите это сделать?
например
Я обнаружил, что редактор OxygenXML неплохо работает работа этого тоже. Это коммерческий редактор, но проверка выполняется с помощью механизма Xerces для проверки (с возможностью использования других). Я пробовал Xerces раньше, и не смог заставить его сообщить после первого ошибка, но они говорят, что заставляют продолжать сообщать. Это действительно хорошая работа.
XMLSpy официально не поддерживает это. Основываясь на том, что я видел в двух редакторах, мне нравится OxygenXML намного больше, чем XMLSpy, и не только из-за этой функции (что действительно приятно, поскольку она это делает).