Страница 1 из 1
опять XML
Добавлено: 04 апр 2013, 13:21
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
}
}
Re: опять XML
Добавлено: 04 апр 2013, 15:22
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);
}
Re: опять XML
Добавлено: 04 апр 2013, 15:33
Masygreen
походу тут ключ в XMLDOMNamedNodeMap_get_Item
иначе по XMLDOMAttribute_get_NodeValue - рантайм и вылет .. попробую
Re: опять XML
Добавлено: 08 апр 2013, 10:43
Masygreen
ни фига не получается ( рантайм
Re: опять XML
Добавлено: 08 апр 2013, 15:41
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.
Re: опять XML
Добавлено: 08 апр 2013, 15:58
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>
Re: опять XML
Добавлено: 09 апр 2013, 12:18
Dmitry_Sol
К сожалению у Галактики достаточно куцый функционал работы с XML.
Но ваша проблема меня не отпускала. Поэтому пришлось вспомнить навыки работы с парсером XML
https://code.google.com/p/js-library-g ... erXML.ZIP
Надеюсь поможет.
Re: опять XML
Добавлено: 09 апр 2013, 15:20
Masygreen
что то вы нерельно круты )) попробую осознать этот дзэн О_о
Re: опять XML
Добавлено: 10 апр 2013, 16:06
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);//мука получается тут !!!! йохохо ...
}
}
Re: опять XML
Добавлено: 10 сен 2013, 12:42
savov
Народ, а подскажите, где функции по разбору xml в Галактике искать? Что подключается и где инфа? В стандартной документации vip чего-то не наблюдаю
Re: опять XML
Добавлено: 10 сен 2013, 15:30
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, если успешно