Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Валидация 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.259 c
15-1334134947
xss22
2012-04-11 13:02
2013.03.22
Утечки памяти в TStringList::GetText()


2-1331843715
Zheksonz
2012-03-16 00:35
2013.03.22
Управление шаговым двигателем через LPT


15-1328905805
Юрий
2012-02-11 00:30
2013.03.22
С днем рождения ! 11 февраля 2012 суббота


15-1349860163
Sinister
2012-10-10 13:09
2013.03.22
MacBook Pro


2-1332071987
Pcrepair
2012-03-18 15:59
2013.03.22
компонент TIdHTTP, разница в синтаксисе для ИНДИ7 и ИНДИ10