Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c