Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-50730
masik
2002-09-05 15:48
2002.09.16
Help with ADOBE


1-50744
AlexandrR
2002-09-04 22:51
2002.09.16
DLL_PROCESS_DETACH / DLL_PROCESS_ATTACH


1-50712
reach
2002-09-02 12:41
2002.09.16
Как получить версию ActiveX компонента


3-50650
Dorosh
2002-08-27 09:44
2002.09.16
Обновление Lookup поля


7-50992
Khov
2002-07-03 09:50
2002.09.16
Имя пользователя, работающего с файлом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский