Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Delphi, xml и БД


Автор: i... 4.4.2004, 16:32
Задача: нужно сделать реляционную базу данных, используя xml. Создаю xml'ку и описываю в ней нужные таблицы и поля. В XML Mapper'e делаю из xml datapacket, и все работает: можно как читать данные из datapacket, так и записывать. Но это не то, что нужно! Нужно работать с xml напрямую, использую transformation (*.xtr файлики). В XML Mapper создал два файла: ToDp.xtr (XML to DataPacket) и ToXml.xtr (DataPacket to XML). Подключил их в Delphi при помощи XMLTransformProvider... Данные отображаются, пробую записать данные в БД, добавив пару строчек, а их в xml'ке нет. Прочитал хелп, зря читал, точно так же я все делал.

Подскажите, пожалуйста, кто сталкивался с таким же и кто не сталкивался, в чем проблема.

Автор: Vit 5.4.2004, 20:58
Покажи код

Автор: i... 6.4.2004, 15:10
Цитата(Vit @ 5.4.2004, 20:58)
Покажи код

Сам xml (db.xml):
<?xml version="1.0" ?>
<database>
<first>
<one>1</one>
<two>2</two>
<three>3</three>
</first>
</database>

Плюс файлы transformations, сделанные при помощи XML Mapper.

Из xml to datapacket (ToDP.xtr):
<XmlTransformation Version="1.0"><Transform Direction="ToCds"><SelectEach dest="DATAPACKET\ROWDATA\ROW" from="\database\first"><Select dest="@one" from="\one"/><Select dest="@two" from="\two"/><Select dest="@three" from="\three"/></SelectEach></Transform><XmlSchema RootName="database"><![CDATA[<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="database" type="databaseType"/>
<xs:complexType name="databaseType">
<xs:sequence>
<xs:element name="first" type="firstType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="first" type="firstType"/>
<xs:complexType name="firstType">
<xs:sequence>
<xs:element name="one" type="oneType"/>
<xs:element name="two" type="twoType"/>
<xs:element name="three" type="threeType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="one" type="oneType"/>
<xs:simpleType name="oneType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="two" type="twoType"/>
<xs:simpleType name="twoType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="three" type="threeType"/>
<xs:simpleType name="threeType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>]]></XmlSchema><CdsSkeleton/><XslTransform/><Skeleton><![CDATA[<?xml version="1.0"?><DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="one" fieldtype="string" WIDTH="32"/><FIELD attrname="two" fieldtype="string" WIDTH="32"/><FIELD attrname="three" fieldtype="string" WIDTH="32"/></FIELDS><PARAMS/></METADATA><ROWDATA/><METADATA><FIELDS><FIELD attrname="one" fieldtype="string" WIDTH="32"/><FIELD attrname="two" fieldtype="string" WIDTH="32"/><FIELD attrname="three" fieldtype="string" WIDTH="32"/></FIELDS><PARAMS/></METADATA><ROWDATA/></DATAPACKET>
]]></Skeleton></XmlTransformation>

Из datapacket to xml (ToXML.xtr):
<XmlTransformation Version="1.0"><Transform Direction="ToXml"><SelectEach from="DATAPACKET\ROWDATA\ROW" dest="\Document\ROW"><Select from="@one" dest="\one"/><Select from="@two" dest="\two"/><Select from="@three" dest="\three"/></SelectEach></Transform><XmlSchema RootName="Document"><![CDATA[<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Document" type="DocumentType"/>
<xs:complexType name="DocumentType">
<xs:sequence>
<xs:element name="ROW" type="ROWType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ROW" type="ROWType"/>
<xs:complexType name="ROWType">
<xs:sequence>
<xs:element name="one" type="oneType"/>
<xs:element name="two" type="twoType"/>
<xs:element name="three" type="threeType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="one" type="oneType"/>
<xs:simpleType name="oneType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="two" type="twoType"/>
<xs:simpleType name="twoType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:element name="three" type="threeType"/>
<xs:simpleType name="threeType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>]]></XmlSchema><CdsSkeleton><![CDATA[<DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="one" fieldtype="string" WIDTH="32"/><FIELD attrname="two" fieldtype="string" WIDTH="32"/><FIELD attrname="three" fieldtype="string" WIDTH="32"/></FIELDS><PARAMS/></METADATA><ROWDATA/><METADATA><FIELDS><FIELD attrname="one" fieldtype="string" WIDTH="32"/><FIELD attrname="two" fieldtype="string" WIDTH="32"/><FIELD attrname="three" fieldtype="string" WIDTH="32"/></FIELDS><PARAMS/></METADATA><ROWDATA/></DATAPACKET>
]]></CdsSkeleton><XslTransform/><Skeleton><![CDATA[<?xml version="1.0"?>
<Document><ROW><one></one><two></two><three></three></ROW></Document>
]]></Skeleton></XmlTransformation>

В Delphi на форму кидаю DBGrid, XMLTransformProvider, ClientDataSet, DataSource.

В XMLTransformProvider заполняю:
XMLDataFile := db.xml;
TransformationFile := ToDp.xtr (это у TransformRead);
TransformationFile := ToXML.xtr (это у TransformWrite);

В ClientDataSet:
ProviderName := XMLTransformProvider;
Active := True;

В DataSource:
DataSet := ClientDataSet;

В DBGrid:
DataSource := DataSource;

И все! Press F9. В DBGrid три колонки One, Two, Three и данные 1, 2, 3, соответственно.
Читать - читаем, а писать в базу - не пишем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)