опять XML

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

опять XML

Сообщение Masygreen »

Не вкурю как прочитать просто элемент, а не атрибут
xml вида

Код: Выделить всё

<root>
 <spec>
    <sp_spec>2005-01-01</sp_spec>
    <sp_spec>2005-02-01</sp_spec>
  </spec>
</root>
разбил на два куска код дабы не листать ...

Код: Выделить всё

  xDom := XMLDOMDoc_New;
  XMLDOMDoc_Load(xDom, _XMLFile);
  hRoot := XMLDOMDoc_DocumentElement(xDom);

  hNodeListR := XMLDOMNode_Get_ChildNodes(hRoot);

  for (i := 0; i < XMLDOMNodeList_Get_Length(hNodeListR); i := i + 1)
  {
    hSpNode := XMLDOMNodeList_Get_Item(hNodeListR, i);
    _str := XMLDOMNode_Get_NodeName(hSpNode);
 

Код: Выделить всё

 
   if(XMLDOMNode_Get_NodeName(hSpNode) = 'spec')
    {

      hSubNodes := XMLDOMNode_Get_ChildNodes(hSpNode);
      for (j := 0; j < XMLDOMNodeList_Get_Length(hSubNodes); j := j + 1)
      {
        hSpSubNodes := XMLDOMNodeList_Get_Item(hSubNodes, j);
        _str := XMLDOMNode_Get_NodeName(hSpSubNodes);
--- вот тут я получаю sp_spec, но как мне блин получить значение 2005-01-01
      }
    }  
Время ведет!
Dmitry_Sol
Постоянный гость
Сообщения: 76
Зарегистрирован: 07 июн 2007, 12:32
Откуда: Витебск
Контактная информация:

Re: опять XML

Сообщение Dmitry_Sol »

Я пользуюсь функцией GetNameAttr(NodeRes: LongInt; NameAtr: String): String;
где NodeRes - handle Node узла -
NameAtr - наименование атрибута - в вашем случае 'sp_spec'

Код: Выделить всё

Function GetNameAttr(NodeRes: LongInt; NameAtr: String): String;
{
  var i          : LongInt;
  var MapNodeList: LongInt;
  var Len        : LongInt;
  var Node       : LongInt;

  GetNameAttr := '';

  MapNodeList := XMLDOMNode_get_Attributes(NodeRes);
  Len         := XMLDOMNamedNodeMap_get_Length(MapNodeList);
  // цикл по всем атрибутам для NodeRes
  for (i := 0; i < Len; Inc(i))
  {
    Node := XMLDOMNamedNodeMap_get_Item(MapNodeList, i);
    if (XMLDOMNode_get_NodeName(Node) = NameAtr)
    {
      GetNameAttr := XMLDOMAttribute_get_NodeValue(Node);
      ReleaseDump(Node);
      break;
    }
    ReleaseDump(Node);
  }
  ReleaseDump(MapNodeList);
}
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: опять XML

Сообщение Masygreen »

походу тут ключ в XMLDOMNamedNodeMap_get_Item
иначе по XMLDOMAttribute_get_NodeValue - рантайм и вылет .. попробую
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: опять XML

Сообщение Masygreen »

ни фига не получается ( рантайм
Время ведет!
Dmitry_Sol
Постоянный гость
Сообщения: 76
Зарегистрирован: 07 июн 2007, 12:32
Откуда: Витебск
Контактная информация:

Re: опять XML

Сообщение Dmitry_Sol »

Занялся вашим xml файлом
Выяснилось, что он не правильной структуры. В нем нет, ни одного элемента. Привел его к правильной структуре.

Код: Выделить всё

<root>
<spec>
    <sp_spec dat="2005-01-01"/>
    <sp_spec dat="2005-02-01"/>
 </spec>
</root>
вот так - гарантированно работает

Код: Выделить всё

#component "C_PARTNER"
Interface read_xml;
Procedure ReleaseDump(var TempNode: LongInt);
{
  XMLDOMNode_Release(TempNode);
  TempNode := 0;
}
Function GetNameAttr(NodeRes: LongInt; NameAtr: String): String;
{
  var i          : LongInt;
  var MapNodeList: LongInt;
  var Len        : LongInt;
  var Node       : LongInt;

  GetNameAttr := '';

  MapNodeList := XMLDOMNode_get_Attributes(NodeRes);
  Len         := XMLDOMNamedNodeMap_get_Length(MapNodeList);
  // цикл по всем атрибутам для NodeRes
  for (i := 0; i < Len; Inc(i))
  {
    Node := XMLDOMNamedNodeMap_get_Item(MapNodeList, i);
    if (XMLDOMNode_get_NodeName(Node) = NameAtr)
    {
      GetNameAttr := XMLDOMAttribute_get_NodeValue(Node);
      ReleaseDump(Node);
      break;
    }
    ReleaseDump(Node);
  }
  ReleaseDump(MapNodeList);
}
handleevent
cmInit:
   {
	  var _xmlFile,_str,_str1,_str2:string;
      var hRoot,xDom,hNodeListR,hSpNode,hSubNodes,hSpSubNodes,i,j:longInt;
       _xmlfile:='test.xml'
	   xDom := XMLDOMDoc_New;
	   XMLDOMDoc_Load(xDom, _XMLFile);
	   hRoot := XMLDOMDoc_DocumentElement(xDom);
	   hNodeListR := XMLDOMNode_Get_ChildNodes(hRoot);

	   for (i := 0; i < XMLDOMNodeList_Get_Length(hNodeListR); i := i + 1)
	   {
		 hSpNode := XMLDOMNodeList_Get_Item(hNodeListR, i);
		 _str := XMLDOMNode_Get_NodeName(hSpNode);
		   if(XMLDOMNode_Get_NodeName(hSpNode) = 'spec')
			{
			  hSubNodes := XMLDOMNode_Get_ChildNodes(hSpNode);
			  for (j := 0; j < XMLDOMNodeList_Get_Length(hSubNodes); j := j + 1)
			  {
				hSpSubNodes := XMLDOMNodeList_Get_Item(hSubNodes, j);
				_str := XMLDOMNode_Get_NodeName(hSpSubNodes);
				_str1:=GetNameAttr(hSpSubNodes,'dat');
				logstrToFile('loggg.txt','Attr_name1='+_str1);
			  }
			}
	   }
   }
 end;
end.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: опять XML

Сообщение Masygreen »

я знаю как разбирать аттрибуты )) xml не зрая привел
Dmitry_Sol писал(а):Занялся вашим xml файлом
Выяснилось, что он не правильной структуры. В нем нет, ни одного элемента. Привел его к правильной структуре.

Код: Выделить всё

<root>
<spec>
    <sp_spec dat="2005-01-01"/>
    <sp_spec dat="2005-02-01"/>
 </spec>
</root>
мне нужны не значения атрибутов а значения полей т.е. получить значение атрибута "dat" -"2005-01-01" - не пролема, а вот получить значение "мука" и "молоко" ..О_о
Написал в ПИР .. может ответят чего ...

Код: Выделить всё

<root>
<spec>
    <sp_spec dat="2005-01-01">Мука </sp_spec>
    <sp_spec dat="2005-02-01"> Молоко</sp_spec>
 </spec>
</root>
Время ведет!
Dmitry_Sol
Постоянный гость
Сообщения: 76
Зарегистрирован: 07 июн 2007, 12:32
Откуда: Витебск
Контактная информация:

Re: опять XML

Сообщение Dmitry_Sol »

К сожалению у Галактики достаточно куцый функционал работы с XML.
Но ваша проблема меня не отпускала. Поэтому пришлось вспомнить навыки работы с парсером XML
https://code.google.com/p/js-library-g ... erXML.ZIP
Надеюсь поможет.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: опять XML

Сообщение Masygreen »

Dmitry_Sol писал(а):К сожалению у Галактики достаточно куцый функционал работы с XML.
Но ваша проблема меня не отпускала. Поэтому пришлось вспомнить навыки работы с парсером XML
https://code.google.com/p/js-library-g ... erXML.ZIP
Надеюсь поможет.
что то вы нерельно круты )) попробую осознать этот дзэн О_о
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: опять XML

Сообщение Masygreen »

итак в память потомкам... общение с ТП привело к некоторым результатам:
1) "Мука" это тот же ChildNodes
2)следовательно для sp_spec тоже получаем XMLDOMNode_Get_ChildNodes
3)получаем потомка - он будет один ... XMLDOMNodeList_get_Item(Item, 0)
4)значение "Мука" получаем XMLDOMCDataSection_get_NodeValue
вот О_о

Код: Выделить всё

    xDom := XMLDOMDoc_New;
    XMLDOMDoc_Load(xDom, _XMLFile);
    hRoot := XMLDOMDoc_DocumentElement(xDom);

    hNodeListR := XMLDOMNode_Get_ChildNodes(hRoot);

    for (i := 0; i < XMLDOMNodeList_Get_Length(hNodeListR); i := i + 1)
    {
      hSpNode := XMLDOMNodeList_Get_Item(hNodeListR, i);
      _str := XMLDOMNode_Get_NodeName(hSpNode);
      if(XMLDOMNode_Get_NodeName(hSpNode) = 'spec')
      {
        hSubNodes := XMLDOMNode_Get_ChildNodes(hSpNode);
        for (j := 0; j < XMLDOMNodeList_Get_Length(hSubNodes); j := j + 1)
        {
          hSpSubNodes := XMLDOMNodeList_get_Item(hSubNodes, j);
          _str := XMLDOMNode_Get_NodeName(hSpSubNodes);
          Item := XMLDOMNode_Get_ChildNodes(hSpSubNodes);
          Element := XMLDOMNodeList_get_Item(Item, 0);
          _strv := XMLDOMCDataSection_get_NodeValue(Element);//мука получается тут !!!! йохохо ...
        }
      }
Время ведет!
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: опять XML

Сообщение savov »

Dmitry_Sol писал(а):К сожалению у Галактики достаточно куцый функционал работы с XML.
Но ваша проблема меня не отпускала. Поэтому пришлось вспомнить навыки работы с парсером XML
https://code.google.com/p/js-library-g ... erXML.ZIP
Надеюсь поможет.
Народ, а подскажите, где функции по разбору xml в Галактике искать? Что подключается и где инфа? В стандартной документации vip чего-то не наблюдаю
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: опять XML

Сообщение edward_K »

1. Была где то ссылка на пример разбора с помощью штатного парсера - ищите "ParserXML.ZIP". Доку по нему соотв. в интернете на MSXML.
2. В vipprogr.chm присутствуют только штатные функции - которые на уровне системы.
3. Вот описание тех , что содержаться в G_EXPIMP.Dll, Есть кстати готовый объект на этих функциях, который грузит с их помощью во временные таблицы - Frm\..\L\L_Common\vip\XML\XMLConverter.vih , но вот описание таблиц разработчик не выкладывает.

Код: Выделить всё

{------------------------------------------------------------------------------}
  // Инициализация и возврат указателя на DOMDocument
  Function XMLDOMDoc_New
    : longint;                   // адрес указателя на XML-DOMDocument
{------------------------------------------------------------------------------}
  // Загрузка DOMDocument из файла
  Function XMLDOMDoc_Load(
    ahSource: longint;           // адрес указателя на DOMDocument
    asSourceName: string         // имя файла, может быть URL
    ): boolean;                  // True - если успешно
{------------------------------------------------------------------------------}
  // Запись DOMDocument в файл
  Function XMLDOMDoc_Save(
    ahSource: longint;           // адрес указателя на DOMDocument
    asFileName: string           // имя файла
    ): boolean;                  // True - если успешно
{------------------------------------------------------------------------------}
  // Получение корневого элемента
  Function XMLDOMDoc_DocumentElement(
    ahSource: longint            // адрес указателя на DOMDocument
    ): longint;                  // адрес указателя на XMLDOMElement
{------------------------------------------------------------------------------}
  // Создание узла "Node"
  Function XMLDOMDoc_CreateNode(
    ahSource: longint;           // адрес указателя на DOMDocument
    aiType: integer;             // тип узла
    asName: string               // наименование узла
    ): longint;                  // адрес указателя на XMLDOMNode
{------------------------------------------------------------------------------}
  // Создание узла "Attribute"
  Function XMLDOMDoc_CreateAttribute(
    ahSource: longint;           // адрес указателя на DOMDocument
    asName: string               // наименование атрибута
    ): longint;                  // адрес указателя на XMLDOMAttribute
{------------------------------------------------------------------------------}
  // Создание узла "CDataSection"
  Function XMLDOMDoc_CreateCDataSection(
    ahSource: longint;           // адрес указателя на DOMDocument
    asData: string               // данные
    ): longint;                  // адрес указателя на XMLDOMCDataSection
{------------------------------------------------------------------------------}
  // Создание узла "Comment"
  Function XMLDOMDoc_CreateComment(
    ahSource: longint;           // адрес указателя на DOMDocument
    asData: string               // текст комментария
    ): longint;                  // адрес указателя на XMLDOMComment
{------------------------------------------------------------------------------}
  // Создание узла "DocumentFragment"
  Function XMLDOMDoc_CreateDocumentFragment(
    ahSource: longint            // адрес указателя на DOMDocument
    ): longint;                  // адрес указателя на XMLDOMDocumentFragment
{------------------------------------------------------------------------------}
  // Создание узла "Element"
  Function XMLDOMDoc_CreateElement(
    ahSource: longint;           // адрес указателя на DOMDocument
    asName: string               // наименование элемента
    ): longint;                  // адрес указателя на XMLDOMElement
{------------------------------------------------------------------------------}
  // Создание узла "EntityReference"
  Function XMLDOMDoc_CreateEntityReference(
    ahSource: longint;           // адрес указателя на DOMDocument
    asName: string               // наименование ссылки
    ): longint;                  // адрес указателя на XMLDOMEntityReference
{------------------------------------------------------------------------------}
  // Создание узла "ProcessingInstruction"
  Function XMLDOMDoc_CreateProcessingInstruction(
    ahSource: longint;           // адрес указателя на DOMDocument
    asName: string;              // наименование инструкции
    asData: string               // текст инструкции
    ): longint;                  // адрес указателя на XMLDOMProcessingInstruction
{------------------------------------------------------------------------------}
  // Создание узла "TextNode"
  Function XMLDOMDoc_CreateTextNode(
    ahSource: longint;           // адрес указателя на DOMDocument
    asData: string               // текст
    ): longint;                  // адрес указателя на XMLDOMTextNode
{------------------------------------------------------------------------------}
  // Чтение NodeValue для узла "Attribute"
  Function XMLDOMAttribute_get_NodeValue(
    ahSource: longint            // адрес указателя на XMLDOMAttribute
    ): string;                   // значение атрибута
{------------------------------------------------------------------------------}
  // Запись NodeValue для узла "Attribute"
  Function XMLDOMAttribute_set_NodeValue(
    ahSource: longint;           // адрес указателя на XMLDOMAttribute
    asValue: string              // значение атрибута
    ): boolean;                  // True, если успешно
{------------------------------------------------------------------------------}
  // Добавление строки в данные для узла "CDataSection"
  Function XMLDOMCDataSection_AppendData(
    ahSource: longint;           // адрес указателя на XMLDOMCDataSection
    asData: string               // добавляемая строка
    ): boolean;                  // True, если успешно
{------------------------------------------------------------------------------}
  // Чтение Length для узла "CDataSection"
  Function XMLDOMCDataSection_get_Length(
    ahSource: longint            // адрес указателя на XMLDOMCDataSection
    ): longint;                  // значение
{------------------------------------------------------------------------------}
  // Чтение NodeValue для узла "CDataSection"
  Function XMLDOMCDataSection_get_NodeValue(
    ahSource: longint            // адрес указателя на XMLDOMCDataSection
    ): string;                   // значение
{------------------------------------------------------------------------------}
  // Запись NodeValue для узла "CDataSection"
  Function XMLDOMCDataSection_set_NodeValue(
    ahSource: longint;           // адрес указателя на XMLDOMCDataSection
    asValue: string              // значение
    ): boolean;                  // True, если успешно
{------------------------------------------------------------------------------}
  // Чтение подстроки из Data для узла "CDataSection"
  Function XMLDOMCDataSection_SubstringData(
    ahSource: longint;           // адрес указателя на XMLDOMCDataSection
    aliOffset: longint;           // смещение
    aliCount: longint             // кол-во символов
    ): string;                   // значение
{------------------------------------------------------------------------------}
  // Добавление атрибута к элементу
  Function XMLDOMElement_SetAttribute(
    ahElement: longint;          // адрес указателя на XMLDOMElement
    asAttrName: string;          // наименование атрибута
    asAttrValue: string          // значение атрибута
    ): boolean;                  // True, если успешно
{------------------------------------------------------------------------------}
  // Подвязка узла к узлу-родителю
  Function XMLDOMNode_AppendChild(
    ahSourceParent: longint;     // адрес указателя на узел-родитель
    ahSourceChild: longint       // адрес указателя на подвязываемый узел
    ): longint;                  // адрес указателя на XMLDOMNamedNodeMap
{------------------------------------------------------------------------------}
  // Чтение Attributes для узла "Node"
  Function XMLDOMNode_get_Attributes(
    ahSource: longint            // адрес указателя на XMLDOMNode
    ): longint;                  // адрес указателя на XMLDOMNodeList
{------------------------------------------------------------------------------}
  // Чтение ChildNodes для узла "Node"
  Function XMLDOMNode_get_ChildNodes(
    ahSource: longint            // адрес указателя на XMLDOMNode
    ): longint;                  // адрес указателя на XMLDOMNodeList
{------------------------------------------------------------------------------}
  // Чтение NodeType для узла "Node"
  Function XMLDOMNode_get_NodeType(
    ahSource: longint            // адрес указателя на XMLDOMNode
    ): integer;                  // значение
{------------------------------------------------------------------------------}
  // Чтение NodeName для узла "Node"
  Function XMLDOMNode_get_NodeName(
    ahSource: longint            // адрес указателя на XMLDOMNode
    ): string;                   // значение
{------------------------------------------------------------------------------}
  // Освобождение ссылки на XMLDOMNode
  Function XMLDOMNode_Release(
    ahSource: longint            // адрес указателя на узел
    ): boolean;                  // True, если успешно
{------------------------------------------------------------------------------}
  // Чтение Length для узла "NamedNodeMap"
  Function XMLDOMNamedNodeMap_get_Length(
    ahSource: longint            // адрес указателя на XMLDOMNamedNodeMap
    ): longint;                  // значение
{------------------------------------------------------------------------------}
  // Чтение Item для узла "NamedNodeMap"
  Function XMLDOMNamedNodeMap_get_Item(
    ahSource: longint;           // адрес указателя на XMLDOMNamedNodeMap
    aliIndex: longint            // индекс
    ): longint;                  // адрес указателя на XMLDOMAttribute (Item[index])
{------------------------------------------------------------------------------}
  // Чтение Length для узла "NodeList"
  Function XMLDOMNodeList_get_Length(
    ahSource: longint            // адрес указателя на XMLDOMNodeList
    ): longint;                  // значение
{------------------------------------------------------------------------------}
  // Чтение Item для узла "NodeList"
  Function XMLDOMNodeList_get_Item(
    ahSource: longint;           // адрес указателя на XMLDOMNodeList
    aliIndex: longint            // индекс
    ): longint;                  // адрес указателя на XMLDOMNode (Item[index])
{------------------------------------------------------------------------------}
  // Чтение списка элементов по TagName
  Function XMLDOMDoc_GetElementsByTagName(
    ahSource: longint;           // адрес указателя на DOMDocument
    asTagName: string            // имя тэга
    ): longint;                  // адрес указателя на XMLDOMNodeList
{------------------------------------------------------------------------------}
  // Освобождение ссылки на DOMDocument
  Function XMLDOMDoc_Done(
    ahSource : longint           // адрес указателя на DOMDocument
    ): boolean;                  // True, если успешно
Ответить