Валидация (проверка) xml-файла по схеме (xsd) в 1С 7.7

База знаний
  1. 10 г. назад
    Процедура ВывестиОшибкуРазбораХМЛ(Ошибка)
    	Сообщить("");
    	Сообщить("Обнаружена ошибка:","!");
    	Сообщить("Смещение = "+Ошибка.filepos+", строка = "+Ошибка.line+", позиция = "+Ошибка.linepos+", код ошибки = "+Ошибка.errorCode,"!");
    	Сообщить("Описание ошибки: "+Ошибка.reason,"!");
    КонецПроцедуры
    
    Функция ВалидацияХМЛпоСхеме(ИмяФайла,ИмяСхемы,ВыводитьВсеОшибки=1)
    	Попытка
    		Схема=СоздатьОбъект("MSXML2.XMLSchemaCache.6.0");
    	Исключение
    		Сообщить("Не удалось создать объект XMLSchemaCache","!");
    		Возврат 0;
    	КонецПопытки;
    	
    	Попытка
    		Схема.add("",ИмяСхемы);
    	Исключение
    		Сообщить("Не удалось подключить схему: "+ИмяСхемы,"!");
    		Возврат 0;
    	КонецПопытки;
    	
    	Попытка
    		ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
    	Исключение
    		Сообщить("Не удалось создать объект DOMDocument","!");
    		Возврат 0;
    	КонецПопытки;
    	
    	ДОМ.schemas=Схема;
    	ДОМ.async=0;
    	ДОМ.validateOnParse=-1;
    	ДОМ.resolveExternals=-1;
    	Если (ВыводитьВсеОшибки=1) Тогда
    		ДОМ.SetProperty("MultipleErrorMessages",-1);
    	КонецЕсли;
    	ДОМ.load(ИмяФайла);
    	
    	Если (ДОМ.parseError.errorCode<>0) Тогда
    		// ошибки при проверке правильности
    		Сообщить("При проверке по схеме файла "+ИмяФайла+" выявлены ошибки!","!");
    		Если (ВыводитьВсеОшибки=1) Тогда
    			Для НомОш=0 По ДОМ.parseError.allErrors.length-1 Цикл
    				parseError=ДОМ.parseError.allErrors.item(НомОш);
    				ВывестиОшибкуРазбораХМЛ(parseError);
    			КонецЦикла;
    		Иначе
    			ВывестиОшибкуРазбораХМЛ(ДОМ.parseError);
    		КонецЕсли;
    		Возврат 0;
    	КонецЕсли;
    	
    	Сообщить("Файл успешно прошёл проверку по схеме!","I");
    	Возврат 1;
    КонецФункции
    
    
  2. У меня:
    http://content.screencast.com/users/Che66/folders/Jing/media/ccb2c843-1bbe-4082-beae-854d3cbc9914/2013-12-17_2236.png
    -image-

    Ответы: (3)
  3. Полез код скопипастить, оказался точно как вышеприведенный.. Из одного места, видать, грабили...

    Ответы: (4)
  4. (1) приветствую! тоже msxml используется?

  5. 17.12.2013 22:43:39 отредактировано andrewks

    (2) это же мой код ))) я его ещё на мисте постил года два назад, а может, и раньше ))
    (была ветка в своё время длинная, про алкодекларации)

  6. Может оттуда и скопипастил я...

  7. Если не трудно, поясните, пожалуйста:
    При создании xml файла средствами v7plus между тегами нет пробелов и mxml понимает в файле (как и текстовые редакторы/просмотрщики) две строки: "?xml version="1.0" encoding="windows-1251"" и все остальное. Соответственно, и все ошибки получаются во второй строке. Как между тегами поставить пробел (как это делает Декларант Алко), чтобы легче было находить ошибки?

    Ответы: (7) (9)
  8. (6) Если через ПоследовательноЗаписываемыйДокумент - то никак. Разве что можно извратиться как-нибудь так:

    Анализатор = СоздатьОбъект("AddIn.XMLParser");
    Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
    Док.ИмяФайла = "r:\tests\1C77\ttest.xml";
    Док.ОткрытьЭлемент("ddd",РазделительСтрок);
    Док.ОткрытьЭлемент("qqq",РазделительСтрок);
    Док.ВключитьЭлемент("zzz",РазделительСтрок+"Абабуа"+РазделительСтрок);
    Док.ЗакрытьЭлемент();
    Док.ЗакрытьЭлемент();
    Док.Сбросить();
    Док.Завершить();

    При этом после начала элемента будет стоять разделитель строк - то есть, строк станет много. Но красивого вида документ не приобретёт. (Переходите на 8-ку, там это реализовано :-) )

    А можно просто взять что-нибудь вроде Visual Studio Express (бесплатная; правда, весит всё равно немало) - и в ней отформатировать документ.

  9. Спасибо,буду пробовать

  10. (6) есть же смещение ошибки. нет никакого смысла в форматировании xml-файла на много строк

    Ответы: (10)
  11. (9) Смысл в форматировании (особенно нормальном форматировании) есть - выискивать ошибку по смещению в строке крайне неудобно (трудно обозреть окружающее). Форматировать файл _после_ того, как обнаружена ошибка - бессмысленно: будет утрачена информация о месте ошибки.
    Можно, кстати, не пользоваться v7plus, а использовать более другие инструменты, поддерживающие indent и прочие прелести. Но если речь идёт о модификации "штатных" обработок - то непонятно, окупит ли себя их переписывание.

    Ответы: (11) (13)
  12. (10) выискивать ошибку проще открыв файл в программе по чтению xml, дабы иметь возможность смотреть данные структурированно

    Ответы: (12) (13)
  13. (11) Верно. Но при этом позиция в строке - уже ни о чём не скажет. Если уж создал весь файл в одну строку.

    Ответы: (13) (16)
  14. (10), (11), (12) Именно этот путь я прошел прежде, чем создал данную ветку. Поэтому и пришел к выводу, что проще структурировать документ на этапе создания...

    Ответы: (15)
  15. Пардон, задал вопрос в этой ветке. (ветку создал на мисте)

  16. 07.01.2014 21:35:16 отредактировано andrewks

    (13) я бы порекомендовал потратить некоторое время на изучение азов. уверяю, потом будет существенно легче.

    почитать можно вот здесь:
    http://www.script-coding.com/index.html
    нужно найти в оглавлении раздел "Язык XML: " - там несколько весьма полезных статей

    плюс может помочь оф.сайт, там описана объектная модель (на английском): http://msdn.microsoft.com/en-us/library/ms764730(v=vs.85).aspx

    неплохая прога для просмотра и редактирования xml-файлов: http://infostart.ru/public/15464/
    ещё есть xmlnotepad2007 от мелкомягких, но она что-то периодически лагает, причём даже на файлах среднего размера.
    также напоминаю, что небольшие xml-файлы можно весьма комфортно просмотреть прямо в браузере (firefox, IE и т.д.)

  17. (12) ну, так там (например, в xmlnotepad2007) уже можно смотреть ошибки визуально, хотя номер строки и смещение он тоже покажет

  18. Спасибо за ссылки, именно азами и занимался на зимних каникулах. Результат http://infostart.ru/public/251318/

    Ответы: (18)
  19. (17) отлично! теперь можно дальше продвигаться - изучать методы 8-ки по работе с XML, XDTO, XPath, Namespaces etc :)

или зарегистрируйтесь чтобы ответить!