![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Валидация XML
Unknown_user © (2011-02-23 16:50:00)Подскажите как в Delphi XE можно выполнить валидацию XML файла согласно XSD схеме. Схема хранится локально и ссылка на нее в XML файле отсутствует. Желательно использование объекта MS XML.
clickmaker (2011-02-24 12:59:00) [1]http://philo.de/xml/downloads.shtml
Unknown_user (2011-02-24 12:27:00) [2]Нет, конечно. Но и упрекать в некомпетентности тоже не нужно.
KilkennyCat (2011-02-24 12:23:00) [3]
> Вы же конкретно так и не ответили ни разу
я тебе что-то должен?
Unknown_user (2011-02-24 11:36:00) [4]Ну если немеряно информации, найдите как выполнить валидацию с выдачей всего списка ошибок а не первой встреченной. Не в C#, там используются феймворк классы, в Delphi XE. Вы же конкретно так и не ответили ни разу. Что то не так с гуглом? Странно давать такие ответы.
Информации в самом деле немеряно, но вырыть нужное не так просто. Поэтому и спрашивал у людей знающих.
KilkennyCat (2011-02-24 01:04:00) [5]
> А KilkennyCat утверждает, что оно находится в первых ссылках,
> выдаваемых гуглом. Вот и стало интересно где же именно.
>
ссылку давал.
второй пост в этой ссылке:
Примеры в SDK есть. Еще можете поискать файлик xsdms.js - реализация валидации на JScript
ради любопытства глянул явовскую реализацию. работает.
гугл, "MSDN XSD validation" - немеряно информации.
разъяснил?
Unknown_user (2011-02-24 00:49:00) [6]>второй шаг по выше приведенной ссылке приводит к работающему примеру.
Ткните носом, пожалуйста. Если имеется ввиду этот код, то он не удовлетворяет поставленной задаче.
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-23 23:06:00) [7]
> Но существует множество версий MS XML, поэтому в описании
> интерфейсов в делфи можно заблудиться. И не так просто найти
> работающий пример.
сказки будешь детям рассказывать.
второй шаг по выше приведенной ссылке приводит к работающему примеру.
Unknown_user (2011-02-23 21:57:00) [8]> Игорь Шевченко
Да, этот код работает, но не выполняется требование выдавать весь список найденных ошибок.
Игорь Шевченко (2011-02-23 21:43:00) [9]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:30:00) [10]Не сомневайтесь, я умею пользоваться поиском. В инете действительно много инфы по данному вопросу. Но существует множество версий MS XML, поэтому в описании интерфейсов в делфи можно заблудиться. И не так просто найти работающий пример.
Собственно говоря, я уже разобрался. Однако, все еще интересно ваше решение.
Unknown_user (2011-02-23 21:24:00) [11]По приведенной ссылке приведен пример проверки XML без XSD схемы. В вопросе звучал именно способ валидации при помощи явного указания XSD файла. Кроме того, забыл упомянуть, что требуется выдача всего списка найденных ошибок а не останов на первой ошибке.
То есть нужна функция вроде
function ValidateXML(XMLFileName, XSDFileName: string; ErrStrs: TStrings): Boolean;
где
XMLFileName - путь к XML файлу для проверки,
XSDFileName - путь к файлу схемы,
ErrStrs - список всех найденных ошибок
функция возвращает True, если XML well-formed и валидный.
KilkennyCat (2011-02-23 21:08:00) [12]забыл сказать - это первая строчка в гугле.
xsd уже лет десять.
задачу валидности трудно назвать нетипичной.
делфи тоже не вчера появилась.
исходя из этого, странно задавать такой вопрос.
KilkennyCat (2011-02-23 21:03:00) [13]http://www.sql.ru/forum/actualthread.aspx?tid=596328