| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Сам 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, соответственно. Читать - читаем, а писать в базу - не пишем. |