Как создать в 7.7 XML, проверить по схемам (XSD, XML) от заказчика и отправить на вебсервер методом Post

Публикация № 84783

Программирование - Практика программирования

96
Немного об API из 1С. Или простой способ создать, проверить и отправить на вебсервер XML-файл.

1С 7.7 спокойно создает такие объекты windows api как  MSXML. Этого более чем достаточно для работы с XML без всяких там dll. Даже если вы не найдете ответа здесь примеры с использованием этой библиотеки, на других языках часто просто достаточно скопировать в 1С и они работают. Так или иначе, описание есть в википедии и на сайте майкрософта.

DOMDocument - объектная модель документа часть библиотеки MSXML и позволяет довольно просто создать XML-файл. Причем может обмениваться данными с другими частями этой библиотеки.

Итак, создаем XML. 4.0 в конце обозначает версию. Если необходима более поздняя - вперед, меняйте.

XML_DOM=CreateObject("MSXML2.DOMDocument.4.0"); 

//Создадим документ опишим его заголовок
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""" ); 

//Если нужен загловок то пишем:
XML_DOM.appendChild(Header);

//для создания тегов используется функция createElement("Имя_Тега")
Тегcообщение = XML_DOM.createElement("MESSAGE");

//чтоб поместить его в наш документ используется функция appendChild(<Ссылка на документ или тег>)
XML_DOM.appendChild(Тегcообщение);

//соответственно чтоб поместить тег внутри тега напишем
ТегТелосообщения=XML_DOM.createElement("BODY");
Тегcообщение.appendChild(ТегТелосообщения);

// Теперь вставим какое-нибудь сообщение
ТегТекстсообщения=XML_DOM.createElement("TextMESSAGE");
ТегТекстсообщения.text   = "наше сообщение";
ТегТелосообщения.appendChild(ТегТекстсообщения);

//А также укажем у него атрибут
АтрибутТекста = XML_DOM.createAttribute("atr");
АтрибутТекста.nodeValue = "text";
ТегТекстсообщения.setAttributeNode(АтрибутТекста);

//а вот так его можно сохранить. И никаких работ со строкой и dll :)
XML_DOM.Save(КаталогИБ()+"1.xml");

//также существует две функции:
// Load() - загружает XML из файла или объекта 
// LoadXML() - загружает Из текста. 
// хоть в 1C напрямую его пишите например:
XML_DOM.loadXML("
|<MESSAGE>
|<BODY>
|<TextMESSAGE atr="text">нашесообщениеText</MESSAGE>
|</BODY>
|</MESSAGE>";

Также существуют и другие параметры, но удача, прямые руки и интернет гарантированно ответят на все вопросы.

Теперь немного об xmlschemacache. Если вам повезло и заказчик выслал схемы xsd или xml - не пугайтесь, вам действительно повезло. Ведь теперь XML можно проверить. Мне просто ну очень хотелось, чтоб сама 1С проверяла, что там мне вписали злодеи юзвери.

А посему вставил сей код, так или иначе в отладке само то:

//У той же самой библиотеки MSXML2 имеется функция проверки
Schema = СоздатьОбъект("msxml2.xmlschemacache.4.0");
Schema.add(, "E:\xsd\MESSAGE.xsd");

XML_DOM.schemas = Schema;
////собственно проверка на валидность
Ошибка = XML_DOM.validate();
Если Ошибка.errorCode = 0 Тогда
    Предупреждение("Документ соответствует схеме");
Иначе
    //// в свойстве .reason содержится причина ошибки.
    Предупреждение("ОШИБКА: "+Ошибка.reason);
КонецЕсли;

Ну и сама собственно отправка через xmlHttp кусок все той же библиотеки. Будьте аккуратны, если есть прокси. Посмотрите описание википедии или найдите пример с прокси. Можно указать как метод Post, так и Get - однако, со своими условиями. Да и методов более чем два. Если будет много плюсов распишу все:

xmlHttp = СоздатьОбъект("MSXML2.xmlHttp.4.0");
xmlHttp.OPEN ("POST", “http://123.123.123.123:70/”, 1);
//Если требуются заголовки
//  xmlHttp.setRequestHeader ("Host", "--SKIPPED--");
//  xmlHttp.setRequestHeader ("Content-type", "text/xml");
xmlHttp.SEND (XML_DOM);

При отсылке имейте в виду, что она не происходит моментально и требуется знать его состояние и получить какой-нибудь ответ.

Состояние находится тут xmlhttp.readyState (0 — не инициализирован, 1 — открыт, 2 — отправка данных, 3 — получение данных и 4 — данные загружены)

Ответ можно получить либо тут xmlHttp.responseText либо xmlHttp. responseXML . Причем, если пришлют XML ответом виде строки, можно загрузить его с помощью нашего DOMDocument'а . Делайте отдельной кнопкой

     XML_DOM.loadXML(xmlHttp.responseText);
//или
     XML_DOM.Save(КаталогИБ()+"2.xml"); 

Прошу не бить за грамотность. Потому как врожденно безграмотный. Пусть это будет полезным, а если будет от плюса не откажусь Wink

96

См. также

Специальные предложения