БланкСШаблоном "Библиотека процедур для работы с XML";

-- Константы

var CLASS_MSXML :STRING = 'Msxml2.DOMDocument.6.0';


-- Процедуры и функции

------------------------------------------------------------
-- Функция возвращает ссылку на новый DOMDocument
func СоздатьДокумент :AutoObject;
  var obj :AutoObject;
  try
    obj=CreateAutoObject(CLASS_MSXML);
  except
    Message("Невозможно использовать компонент 'MSXML6'!"+chr(13)+
            "По причине: '"+ErrorMessage+"'."+chr(13)+
            "Убедитесь, что ваша операционная система Windows XP Service Pack 3 или новее.",mtError);
    raise;
  end;
  return obj;
end;

------------------------------------------------------------
-- Процедура сохраняет текущий DOMDocument в файл
proc СохранитьДокумент(Документ :AutoObject; Файл :String);
  Документ.Save(Файл);
end;

------------------------------------------------------------
-- Функция удаляет объект по ссылке
proc УдалитьОбъект(obj :AutoObject);
  ClearVariable(obj);
end;

------------------------------------------------------------------------------------------------------------------
-- Функция СоздатьЭлемент создает элемент без атрибутов, возвращает ссылку на новый элемент
func СоздатьЭлемент(Документ :AutoObject; Элемент :AutoObject; Имя :String; Значение :String) :AutoObject;
  var obj :AutoObject;
  obj=AsAutoObject(Документ.createElement(Имя));
  try
    obj.text=Значение;
    Элемент.appendChild(obj);
  except
    ClearVariable(obj);
    raise;
  end;
  return obj;
end;

------------------------------------------------------------------------------------------------------------------
-- Процедура СоздатьЭлементКон создает элемент без атрибутов
proc СоздатьЭлементКон(Документ :AutoObject; Элемент :AutoObject; Имя :String; Значение :String);
  var obj :AutoObject;
  obj=AsAutoObject(Документ.createElement(Имя));
  try
    obj.text=Значение;
    Элемент.appendChild(obj);
  finally
    ClearVariable(obj);
  end;
end;

------------------------------------------------------------------------------------------------------------------
-- Процедура СоздатьАтрибут создает атрибут для указанного элемента
proc СоздатьАтрибут(Документ :AutoObject; Элемент :AutoObject; Имя :String; Значение :String);
  var obj :AutoObject;
  obj=AsAutoObject(Документ.createAttribute(Имя));
  try
    obj.nodeValue=Значение;
    Элемент.setAttributeNode(obj);
  finally
    ClearVariable(obj);
  end;
end;

------------------------------------------------------------------------------------------------------------------
-- Функция преобразует документ по XSLT схеме хранящейся в файле, возвращает новую ссылку но новый документ
func ПреобразоватьДокумент(Документ :AutoObject; Файл :String) :AutoObject;
  var objDOM,objRes,objRet :AutoObject;

  objRet=Документ;

  if (not ExistFile(Файл)): return objRet; fi;

  objDOM=СоздатьДокумент;
  try
    objDOM.async=false;
    objDOM.load(Файл);

    objRes=СоздатьДокумент;
    try
      objRes.async=false;
      objRes.validateOnParse=true;
      Документ.transformNodeToObject(objDOM,objRes);
      objRet=objRes;
      objRes=Документ;
    finally
      ClearVariable(objRes);
    end;
  finally
    ClearVariable(objDOM);
  end;
  return objRet;
end;

------------------------------------------------------------------------------------------------------------------
-- Поиск файла в специальной папке
Func НайтиФайлСхемы(Файл :String) :String;
  Файл=PlanVar('STD_RPO')+'\'+Файл;
  Файл=if(ExistFile(Файл),Файл,'');
  return Файл;
end;
------------------------------------------------------------------------------------------------------------------

var СчитанныеИндексы[]  :Integer;
var СчитанныеЭлементы[] :String;
var СчитанныеЗначения[] :String;
var СчитанныеАтрибуты[] :String;
var СчитанныеАтрИмя[]   :String;
var СчитанныеАтрЗнач[]  :String;

DOM :AutoObject;

Proc ОткрытьXML (Файл :String);
  DOM=СоздатьДокумент;
  DOM.async=false;
  DOM.load(Файл);
end;

Proc ЗакрытьXML;
  УдалитьОбъект(DOM);
end;

--Func ВыполнитьЗапрос(Выражение :String) :AutoObject;
--  return AsAutoObject(DOM.selectNodes(Выражение));
--end;

Func СчитатьЭлементы(Выражение :String; Элементы :String; СчитатьАтрибуты :Logical) :Integer;
  var objExpElems :AutoObject;
  var objExpElem :AutoObject;
  var objElems :AutoObject;
  var objElem :AutoObject;
  var objAttribs :AutoObject;
  var objAttrib :AutoObject;
  var i,j,y,ni,nj,ny,x,xx :Integer;

  ClearVariable(РАБ.XML2.СчитанныеИндексы);
  ClearVariable(РАБ.XML2.СчитанныеЭлементы);
  ClearVariable(РАБ.XML2.СчитанныеЗначения);
  ClearVariable(РАБ.XML2.СчитанныеАтрибуты);
  ClearVariable(РАБ.XML2.СчитанныеАтрИмя);
  ClearVariable(РАБ.XML2.СчитанныеАтрЗнач);

  objExpElems=AsAutoObject(DOM.selectNodes(Выражение));
  try
    ni=AsInteger(objExpElems.length);
    for i=1..ni do
      objExpElem=AsAutoObject(objExpElems.item(i-1));
      try
        objElems=AsAutoObject(objExpElem.selectNodes(Элементы));
        try
          nj=AsInteger(objElems.length);
          for j=1..nj do
            objElem=AsAutoObject(objElems.item(j-1));
            try
              x=x+1;
              СчитанныеИндексы[x]=i;
              СчитанныеЭлементы[x]=AsString(objElem.nodeName);
              СчитанныеЗначения[x]=AsString(objElem.text);

              if СчитатьАтрибуты:
                objAttribs=AsAutoObject(objElem.attributes);
                try
                  ny=AsInteger(objAttribs.length);
                  for y=1..ny do
                    objAttrib=AsAutoObject(objAttribs.item(y-1));
                    try
                      xx=xx+1;
                      СчитанныеАтрибуты[x]=СчитанныеАтрибуты[x]+str(xx)+'|';
                      СчитанныеАтрИмя[xx]=AsString(objAttrib.name);
                      СчитанныеАтрЗнач[xx]=AsString(objAttrib.value);
                    finally
                      ClearVariable(objAttrib);
                    end;
                  od;
                finally
                  ClearVariable(objAttribs);
                end;
              fi;

            finally
              ClearVariable(objElem);
            end;
          od;
        finally
          ClearVariable(objElems);
        end;
      finally
        ClearVariable(objExpElem);
      end;
    od;
  finally
    ClearVariable(objExpElems);
  end;

  return x;
end;




Конец