Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

OpenXML   Найти похожие ветки 

 
Yakudza ©   (2002-09-02 14:09) [0]

Кто нибуть юзал OpenXML?
Киньте пример как создать XML документ.


 
asat ©   (2002-09-02 15:23) [1]

http://www.whirlwater.com/information/2000/delphi/creatingxmlwithopenxml.html


 
vuk ©   (2002-09-02 15:35) [2]

Я как-то здесь уже приводил пример работы с OpenXML. По идее, он должен работать и с текущей версией OpenXML.

Вот, повторяю:

------------------------------------------------------
Допустим, нужно работать с документом такой структуры:
(не знаю ли пропустит ли это скрипт...)


<?xml version="1.0" encoding="UTF-8"?>
<test_document>
<List>
<Item attr1="a" attr2="b">value1</Item>
<Item attr1="c" attr2="d">value2</Item>
</List>
</test_document>


Вот пример создания этого документа:


program Project1;
{$APPTYPE CONSOLE}

uses
SysUtils, Classes, XDOM_2_3;

var
DomImpl : TDOMImplementation;
XMLParser : TXmlToDomParser;
Document : TDOMDocument;
Root, list, item : TDOMElement;
S : TFileStream;
Txt : TDOMText;
begin

DomImpl := TDOMImplementation.Create( nil );
XMLParser := TXmlToDomParser.Create( nil );
XMLParser.DOMImpl := DomImpl;

//создание документа
Document := DOMImpl.createDocument( "test_document", nil );
//корневой элемент документа
Root := Document.documentElement;

list := Document.createElement("List");
Root.appendChild(List);

//создание элемента с двумя атрибутами и значением
item := Document.createElement("Item");
List.appendChild(item);
Item.setAttribute("attr1", "a");
Item.setAttribute("attr2", "b");
txt := Document.createTextNode("value1");
item.appendChild(txt);

//и еще одного
item := Document.createElement("Item");
List.appendChild(item);
Item.setAttribute("attr1", "c");
Item.setAttribute("attr2", "d");
txt := Document.createTextNode("value2");
item.appendChild(txt);


//сохранение документа
S := TFileStream.Create( "test.xml", fmCreate );
try
Document.writeCodeAsUTF8( S );
finally
S.Free;
end;

XMLParser.Free;
DomImpl.Free;
end.


vuk © (17.04.02 02:07)
Теперь чтение этого документа

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils,
Classes,
XDOM_2_3;

function FindElement( Element : TDomNode; const ElementName : string ) : TDomElement;
var
tmp : TDOMNode;
begin
Result := nil;
tmp := Element;
while tmp <> nil do
begin
if tmp.nodeType = ntElement_Node then
begin
if ANSICompareText( tmp.nodeName, ElementName) = 0 then
begin
Result := TDOMElement( tmp );
break;
end;
end;
tmp := tmp.nextSibling;
end;

end;

function GetNextElement( Element : TDomElement; const ElementName : string ) : TDomElement;
begin
Result := FindElement( Element.nextSibling, ElementName );
end;


function GetChildElement( Root : TDomElement; const ElementName : string ) : TDomElement;
begin
Result := FindElement( Root.FirstChild, ElementName );
end;

procedure ShowItem( Item : TDOMElement );
begin
with Item do
writeln( format( "Element: %s, attr1:%s, attr2:%s",
[ nodeName, getAttribute("attr1"), getAttribute("attr2")]));
end;


var
DomImpl : TDOMImplementation;
XMLParser : TXmlToDomParser;
Document : TDOMDocument;
Root, list, item : TDOMElement;
S : TFileStream;
Txt : TDOMText;
begin
DomImpl := TDOMImplementation.Create( nil );
XMLParser := TXmlToDomParser.Create( nil );
XMLParser.DOMImpl := DomImpl;

XMLParser.fileToDom("test.xml");
//документ
Document := TDOMDocument(DOMImpl.documents.item(0));
//корневой элемент документа
Root := Document.documentElement;
//элемент List
List := GetChildElement( Root, "list" );
if List <> nil then
begin
Item := GetChildElement( List, "item" );
//цикл по элементам списка
while Item <> nil do
begin
ShowItem( Item );
Item := GetNextElement(Item, "item" );
end;
end;

XMLParser.Free;
DomImpl.Free;


readln;

end.


vuk © (17.04.02 02:25)
Если хотите добраться до каждого атрибута не по имени, то можно ShowItem переписать так:


procedure ShowItem( Item : TDOMElement );
var
i : integer;
attr : TdomAttr;
begin
writeln( "Element :" + Item.nodeName );
with Item.attributes do
begin
writeln( "Attribute count:", length );
for i := 0 to length -1 do
begin
Attr := item(i)as TdomAttr;
writeln( Attr.nodeName, "=",Attr.Value );

end;
end;
writeln;
end;


 
Yakudza ©   (2002-09-02 17:25) [3]

Ругаеться на вот это строчку.

Document.writeCodeAsUTF8(S);


 
vuk ©   (2002-09-02 18:18) [4]

Что-то типа того:
var
ToXMLParser : TDOMToXMLParser;
...


S := TFileStream.Create( "test.xml", fmCreate );
try
ToXMLParser := TDOMToXMLParser.Create( nil );
try
ToXMLParser.DOMImpl := DomImpl;
ToXMLParser.writeToStream(Document, "UTF-8", s );
finally
ToXMLParser.Free;
end;
finally
S.Free;
end;


 
Yakudza ©   (2002-09-03 11:11) [5]

Спасибо!
Теперь все работает.



Страницы: 1 вся ветка

Текущий архив: 2002.09.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-50817
ErmSergey
2002-08-31 14:24
2002.09.16
Утечка ресурсов


3-50603
Gaber
2002-08-26 10:57
2002.09.16
Русский шрифт в Database Desktop


1-50821
Shrek
2002-09-03 19:33
2002.09.16
WinApi


1-50710
Сергей Нечепуренко
2002-09-05 11:20
2002.09.16
Как запустить из программы другой exe файл?


7-51001
Gogos
2002-07-07 11:53
2002.09.16
Как можно изменить текст «Приветствие» при старте Win XP?