Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Валидация XML   Найти похожие ветки 

 
Unknown_user   (2011-02-23 16:50) [0]

Подскажите как в Delphi XE можно выполнить валидацию XML файла согласно XSD схеме. Схема хранится локально и ссылка на нее в XML файле отсутствует. Желательно использование объекта MS XML.


 
KilkennyCat ©   (2011-02-23 21:03) [1]

http://www.sql.ru/forum/actualthread.aspx?tid=596328


 
KilkennyCat ©   (2011-02-23 21:08) [2]

забыл сказать - это первая строчка в гугле.

xsd уже лет десять.
задачу валидности трудно назвать нетипичной.
делфи тоже не вчера появилась.

исходя из этого, странно задавать такой вопрос.


 
Unknown_user   (2011-02-23 21:24) [3]

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

То есть нужна функция вроде

function ValidateXML(XMLFileName, XSDFileName: string; ErrStrs: TStrings): Boolean;

где

XMLFileName -  путь к XML файлу для проверки,
XSDFileName - путь к файлу схемы,
ErrStrs - список всех найденных ошибок

функция возвращает True, если XML well-formed и валидный.


 
Unknown_user   (2011-02-23 21:30) [4]

Не сомневайтесь, я умею пользоваться поиском. В инете действительно много инфы по данному вопросу. Но существует множество версий MS XML, поэтому в описании интерфейсов в делфи можно заблудиться. И не так просто найти работающий пример.

Собственно говоря, я уже разобрался. Однако, все еще интересно ваше решение.


 
Игорь Шевченко ©   (2011-02-23 21:43) [5]

function DOMCheckByXSDWithNamespace(XML: IXMLDOMDocument2; const XsdDoc: string;
 var ErrMsg: string; const aNamespace: string = ""): boolean;
var
 SchCache: IXMLDOMSchemaCollection;
 aXML: IXMLDOMDocument2;
 Path: OleVariant;
 xmlErr: string;
 XsdBuffer: array[0..MAX_PATH] of Char;
 XsdFilePart: PChar;
begin
 Path := XsdDoc;
 SchCache := nil;
 if MSXML6Installed then
   SchCache := CoXMLSchemaCache60.Create
 else if MSXML4Installed then
   SchCache := CoXMLSchemaCache40.Create
 else if MSXML3Installed then
   SchCache := CoXMLSchemaCache30.Create;
 SchCache.add(aNamespace, Path);
 aXML := CreateXMLDOM;
 aXML.Schemas := SchCache;
 aXML.Async := False;
 aXML.ValidateOnParse := True;
 aXML.SetProperty("NewParser", True);
 aXML.loadXML(XML.xml);
 Result := aXML.parseError.errorCode = 0;
 if not Result then
 begin
   with aXML.ParseError do
   begin
     ErrMsg := Format(EM_PARSE_ERROR, [ErrorCode, Line, LinePos, Reason]);
   end;
 end;
end;

ну вот как-то так...


 
Unknown_user   (2011-02-23 21:57) [6]

> Игорь Шевченко

Да, этот код работает, но не выполняется требование выдавать весь список найденных ошибок.


 
KilkennyCat ©   (2011-02-23 23:06) [7]


> Но существует множество версий MS XML, поэтому в описании
> интерфейсов в делфи можно заблудиться. И не так просто найти
> работающий пример.

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


 
Unknown_user   (2011-02-24 00:49) [8]

>второй шаг по выше приведенной ссылке приводит к работающему примеру.

Ткните носом, пожалуйста. Если имеется ввиду этот код, то он не удовлетворяет поставленной задаче.

 xmlDoc := CoDOMDocument.Create;
 xmlDoc.async := False;
 xmlDoc.load("c:\TextXml.xml");
 xmlErr := xmlDoc.validate;
 if xmlErr.errorCode <> 0 then
   ShowMessage(xmlErr.reason + #13#10 + xmlErr.srcText );


Игорь Шевченко привел пример валидации XML по произвольному XSD файлу (именно валидации согласно XSD, я упоминал уже не раз что мне нужно). Спасибо ему за это.

Но и этот код не удовлетворяет второму условию. Валидация останавливается на первой ошибке. Мне нужен список всех ошибок в XML.

Повторюсь, после публикации своего вопроса я таки разобрался по MSDN как это сделать. И это оказалось не так и сложно в итоге. Просто нигде не нашел готового решения. А KilkennyCat утверждает, что оно находится в первых ссылках, выдаваемых гуглом. Вот и стало интересно где же именно.


 
KilkennyCat ©   (2011-02-24 01:04) [9]


>  А KilkennyCat утверждает, что оно находится в первых ссылках,
>  выдаваемых гуглом. Вот и стало интересно где же именно.
>

ссылку давал.
второй пост в этой ссылке:
Примеры в SDK есть. Еще можете поискать файлик xsdms.js - реализация валидации на JScript
ради любопытства глянул явовскую реализацию. работает.

гугл, "MSDN XSD validation" - немеряно информации.

разъяснил?


 
Unknown_user   (2011-02-24 11:36) [10]

Ну если немеряно информации, найдите как выполнить валидацию с выдачей всего списка ошибок а не первой встреченной. Не в C#, там используются феймворк классы, в Delphi XE. Вы же конкретно так и не ответили ни разу. Что то не так с гуглом? Странно давать такие ответы.

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


 
KilkennyCat ©   (2011-02-24 12:23) [11]


> Вы же конкретно так и не ответили ни разу

я тебе что-то должен?


 
Unknown_user   (2011-02-24 12:27) [12]

Нет, конечно. Но и упрекать в некомпетентности тоже не нужно.


 
clickmaker ©   (2011-02-24 12:59) [13]

http://philo.de/xml/downloads.shtml



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.063 c
15-1329506289
TUser
2012-02-17 23:18
2013.03.22
Элемент униформы


2-1330700037
German
2012-03-02 18:53
2013.03.22
МойДатаСет


15-1338987676
Давайте будем жрать!
2012-06-06 17:01
2013.03.22
Отладка в XE2


2-1347989696
vegarulez
2012-09-18 21:34
2013.03.22
синхронизация потока.


15-1351168672
картман
2012-10-25 16:37
2013.03.22
что за вольный стиль?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский