Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизОбращение к полю XML Найти похожие ветки
← →
XGarik (2005-09-27 09:53) [0]Доброго времени суток!
У меня запарка с преобразованием из XML (точнее одной его таблицы) в таблицу вида DBF! Можно ли сохранить таблицу XML-файла, как DBF-файл?
Конкретно:
Как обратиться ко всем полям таблицы records.
Например: records -> dobxod.
Структура XML следующая:<?xml version="1.0" encoding="windows-1251" ?>
<ObxodDB>
<xs:schema id="ObxodDB" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ObxodDB" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="remark">
<xs:complexType>
<xs:sequence>
<xs:element name="nremark" type="xs:int" minOccurs="0" />
<xs:element name="cremarkrash" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="dobxod" type="xs:date" minOccurs="0" />
<xs:element name="nmaror" type="xs:int" minOccurs="0" />
<xs:element name="nnumbervv" type="xs:int" minOccurs="0" />
<xs:element name="nvv" type="xs:int" minOccurs="0" />
<xs:element name="cstatus" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
</ObxodDB>
Заранее благодарю!
← →
Desdechado © (2005-09-27 11:02) [1]метод "влоб":
1. засасываешь XML в ClientDataSet
2. выгружаешь в DBF нужной тебе структуры, пробегаясь по записям
← →
XGarik (2005-09-27 11:08) [2]Desdechado
А можно простенький примерчик обращения к полю XML? Или как пробежаться по xml-ке?
← →
Desdechado © (2005-09-27 13:40) [3]бегать надо по набору данных в ClientDataSet"е
или по парку :)
← →
XGarik (2005-09-27 14:20) [4]Хорошо!
Тупой вопрос:
А, как тогда загрузить XML в ClientDataSet?
← →
XGarik (2005-09-27 15:08) [5]Вопрос не снят! Пожалуйста, помогите!
← →
АлеКо (2005-09-28 03:45) [6]Вот может в эту сторону копать.
"Структура XML иерархична, и это фундаментальное положение необходимо принимать во внимание. Наиболее концептуальное представление иерархичной структуры известно как объектная модель документа (DOM). В этой модели документ XML рассматривается как набор узлов в древовидной структуре. Узлы могут быть элементами, атрибутами, текстом,
комментариями или инструкциями обработки."
С помощью DOM Вы можете обратиться к любому узлу документа.
← →
АлеКо (2005-09-28 04:39) [7]Для реализации DOM на вкладке Internet есть компонента TXMLDocument. Попробуй через него реализовать доступ к данным.(D6).
← →
XGarik © (2005-09-28 08:44) [8]Я много чего уже испробовал: TXMLDocument, ClientDataSet и д.р. Ничего хорошего у меня из этого не вышло!
Впринципе, в свое время я писал даже класс для чтения xml-ки, используя чтение из файла, как текста и потом прозводил анализ.
Но сейчас я хочу сделать все правильно! Чтобы не просто работало для опред. ситуации, но чтобы для любой!
Помогите загрузить файл, скажем: 1.xml в ClientDataSet, дальше я сам разберусь!
У меня код:procedure TForm1.Button1Click(Sender: TObject);
begin
clientdataset1.LoadFromFile("1.xml");
end;
Почему пишет ошибку: Mismatch in datapacket.
← →
АлеКо (2005-09-28 09:05) [9]На сколько я помню надо создать файл трансформации твоего XML с расширением XTR
<XmlTransformation Version="1.0">
Я это делал с помощью утилиты XML Mapper ( поставляется с Delphi 6)
Далее надо указать TXMLTransform и в нем файл трансформации.
Вот как у меня выглядит это дело в потоке:
CoInitialize(nil);
XMLTrans:=TXMLTransform.Create(nil);
DataSetXML:=TClientDataSet.Create(nil);
DataSetP:= TDataSetProvider.Create(nil);
XMLTrans.SourceXmlFile:=_XMLFile;
XMLTrans.TransformationFile:=_XTRFile;
DataSetP.DataSet:=DataSetXML;
try
DataSetXML.XMLData:=XMLTrans.Data;
except
ShowMessage("Ошибка получения данных");
end;
Synchronize(Update);
XMLTrans.Destroy;
DataSetXML.Destroy;
DataSetP.Destroy;
CoUnInitialize();
но мне не нравиться как это работает. Очень медленно.
← →
Top © (2005-09-28 09:24) [10]открой в excel свой xml и пересохрани в dbf
← →
XGarik © (2005-09-28 10:00) [11]Top, АлеКо
Руками нельзя, только программно! Неужели нет более гуманного способа сделать чтение из XML, кроме как загонять в xrp, через xml mapper?
← →
dmitry501 © (2005-09-28 10:14) [12]Есть. Например-
function RecordsetFromXML(const XML: string): _Recordset;
var
RS: Variant;
Stream: TStringStream;
begin
Result := nil;
if XML = "" then
Exit;
Stream := TStringStream.Create(XML);
try
Stream.Position := 0;
RS := CreateOleObject("ADODB.Recordset");
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result := IUnknown(RS) as _Recordset;
finally
Stream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RecordsetFromXML("test.xml");
end;
Но Ваши данные не в формате recordset ADO или ADTG :(
← →
XGarik © (2005-09-28 10:59) [13]dmitry501
К сожалению действительно не подходит!
Пишет: Не удается создать набор записей из указанного источника. Файл источника или поток должен содержать данные Recordset в формате XML или ADTG.
Как загрузить в ClientDataSet используя xrp-файл, созданный вручную мне рассказал товарищь АлеКо! Но программа тоже жестоко ругалась: Ошибка получения данных:
XML Parse Error:
Reason: An invalid character was found in text content.
Error on line 1, position 1641.
Может я криво сформировал xrp-файл. Тогда, как его правильно сделать?
Повторяю задачу:
Есть xml с именем test.xml:<?xml version="1.0" encoding="windows-1251" ?>
<ObxodDB>
<xs:schema id="ObxodDB" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ObxodDB" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="remark">
<xs:complexType>
<xs:sequence>
<xs:element name="nremark" type="xs:int" minOccurs="0" />
<xs:element name="cremarkrash" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="dobxod" type="xs:date" minOccurs="0" />
<xs:element name="nmaror" type="xs:int" minOccurs="0" />
<xs:element name="nnumbervv" type="xs:int" minOccurs="0" />
<xs:element name="nvv" type="xs:int" minOccurs="0" />
<xs:element name="cstatus" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<remark>
<nremark>1</nremark>
<cremarkrash>Примечание1</cremarkrash>
</remark>
<remark>
<nremark>2</nremark>
<cremarkrash>Примечание2</cremarkrash>
</remark>
<records>
<dobxod>2005-09-28</dobxod>
<nmaror>1</nmaror>
<nnumbervv>1</nnumbervv>
<nvv>1000</nvv>
<cstatus>Готово</cstatus>
</records>
<records>
<dobxod>2005-09-28</dobxod>
<nmaror>1</nmaror>
<nnumbervv>2</nnumbervv>
<nvv>2000</nvv>
<cstatus>Готово1</cstatus>
</records>
</ObxodDB>
Необходимо выкусить содержимое поля cstatus, 1 записи, таблицы records.
И вывести это в ShowMessage({обращение к полю}) и на экране загорается надпись "Готово".... Как это сделать?... Очень... очень срочно!!! Буду рад любым ответам! Знаю, что я сильно туплю, но эту задачу нужно решить уже до завтра!
← →
Вольный Стрелок © (2005-09-28 11:03) [14]Несмотря на одинаковость расширений файлов XML разные. Твой похоже, что dotnet-овский, а в нем допустимы вложенные датасеты...
← →
Андрей Жук © (2005-09-28 11:34) [15]курить SAX, DOM, XPath
← →
XGarik © (2005-09-28 12:52) [16]Андрей Жук К сожалению я не курю :D! Можно подробней! Просто я очень плохо знаю термины XML, а времени на их изучение не осталось!
← →
XGarik © (2005-09-28 18:39) [17]Ответ до сих пор не разгадан! Помогите! Сегодня буду сидеть всю ночь!
← →
АлеКо (2005-09-29 03:40) [18]Я считаю что для правильной работы твоя схема должна выглядить так:
<?xml version="1.0" encoding="windows-1251" ?>
<xs:schema id="ObxodDB" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ObxodDB" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="remark">
<xs:complexType>
<xs:sequence>
<xs:element name="nremark" type="xs:int" minOccurs="0" />
<xs:element name="cremarkrash" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="records">
<xs:complexType>
<xs:sequence>
<xs:element name="dobxod" type="xs:date" minOccurs="0" />
<xs:element name="nmaror" type="xs:int" minOccurs="0" />
<xs:element name="nnumbervv" type="xs:int" minOccurs="0" />
<xs:element name="nvv" type="xs:int" minOccurs="0" />
<xs:element name="cstatus" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
а файл с данными так:
<?xml version="1.0" encoding="windows-1251" ?>
<ObxodDB>
<remark>
<nremark>1</nremark>
<cremarkrash>Примечание1</cremarkrash>
</remark>
<remark>
<nremark>2</nremark>
<cremarkrash>Примечание2</cremarkrash>
</remark>
<records>
<dobxod>2005-09-28</dobxod>
<nmaror>1</nmaror>
<nnumbervv>1</nnumbervv>
<nvv>1000</nvv>
<cstatus>Готово</cstatus>
</records>
<records>
<dobxod>2005-09-28</dobxod>
<nmaror>1</nmaror>
<nnumbervv>2</nnumbervv>
<nvv>2000</nvv>
<cstatus>Готово1</cstatus>
</records>
</ObxodDB>
у Вас все это зачем то объединено в один файл, мне кажется это не правильно.
← →
XGarik © (2005-09-29 08:47) [19]Я делал по аналогии с примером Microsoft (Inventory.xml урезанный до 1-го поля):
<Inventory>
<xs:schema id="Inventory" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Inventory" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Customers">
<xs:complexType>
<xs:sequence>
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
<xs:element name="CompanyName" type="xs:string" minOccurs="0" />
<xs:element name="ContactName" type="xs:string" minOccurs="0" />
<xs:element name="ContactTitle" type="xs:string" minOccurs="0" />
<xs:element name="Address" type="xs:string" minOccurs="0" />
<xs:element name="City" type="xs:string" minOccurs="0" />
<xs:element name="Region" type="xs:string" minOccurs="0" />
<xs:element name="PostalCode" type="xs:string" minOccurs="0" />
<xs:element name="Country" type="xs:string" minOccurs="0" />
<xs:element name="Phone" type="xs:string" minOccurs="0" />
<xs:element name="Fax" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Orders">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:int" minOccurs="0" />
<xs:element name="CustomerID" type="xs:string" minOccurs="0" />
<xs:element name="EmployeeID" type="xs:int" minOccurs="0" />
<xs:element name="OrderDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="RequiredDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="ShippedDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="ShipVia" type="xs:int" minOccurs="0" />
<xs:element name="Freight" type="xs:decimal" minOccurs="0" />
<xs:element name="ShipName" type="xs:string" minOccurs="0" />
<xs:element name="ShipAddress" type="xs:string" minOccurs="0" />
<xs:element name="ShipCity" type="xs:string" minOccurs="0" />
<xs:element name="ShipRegion" type="xs:string" minOccurs="0" />
<xs:element name="ShipPostalCode" type="xs:string" minOccurs="0" />
<xs:element name="ShipCountry" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Order_x0020_Details">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:int" minOccurs="0" />
<xs:element name="ProductID" type="xs:int" minOccurs="0" />
<xs:element name="UnitPrice" type="xs:decimal" minOccurs="0" />
<xs:element name="Quantity" type="xs:short" minOccurs="0" />
<xs:element name="Discount" type="xs:float" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Products">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductID" type="xs:int" minOccurs="0" />
<xs:element name="ProductName" type="xs:string" minOccurs="0" />
<xs:element name="SupplierID" type="xs:int" minOccurs="0" />
<xs:element name="CategoryID" type="xs:int" minOccurs="0" />
<xs:element name="QuantityPerUnit" type="xs:string" minOccurs="0" />
<xs:element name="UnitPrice" type="xs:decimal" minOccurs="0" />
<xs:element name="UnitsInStock" type="xs:short" minOccurs="0" />
<xs:element name="UnitsOnOrder" type="xs:short" minOccurs="0" />
<xs:element name="ReorderLevel" type="xs:short" minOccurs="0" />
<xs:element name="Discontinued" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Customers>
<CustomerID>ANTON</CustomerID>
<CompanyName>Antonio Moreno Taquería</CompanyName>
<ContactName>Antonio Moreno</ContactName>
<ContactTitle>Owner</ContactTitle>
<Address>Mataderos 2312</Address>
<City>México D.F.</City>
<PostalCode>05023</PostalCode>
<Country>Mexico</Country>
<Phone>(5) 555-3932</Phone>
</Customers>
<Orders>
<OrderID>10302</OrderID>
<CustomerID>SUPRD</CustomerID>
<EmployeeID>4</EmployeeID>
<OrderDate>1996-09-10T00:00:00.0000000-07:00</OrderDate>
<RequiredDate>1996-10-08T00:00:00.0000000-07:00</RequiredDate>
<ShippedDate>1996-10-09T00:00:00.0000000-07:00</ShippedDate>
<ShipVia>2</ShipVia>
<Freight>6.27</Freight>
<ShipName>Suprêmes délices</ShipName>
<ShipAddress>Boulevard Tirou, 255</ShipAddress>
<ShipCity>Charleroi</ShipCity>
<ShipPostalCode>B-6000</ShipPostalCode>
<ShipCountry>Belgium</ShipCountry>
</Orders>
<Order_x0020_Details>
<OrderID>10331</OrderID>
<ProductID>54</ProductID>
<UnitPrice>0.99</UnitPrice>
<Quantity>15</Quantity>
<Discount>0</Discount>
</Order_x0020_Details>
<Products>
<ProductID>8</ProductID>
<ProductName>Northwoods Cranberry Sauce</ProductName>
<SupplierID>3</SupplierID>
<CategoryID>2</CategoryID>
<QuantityPerUnit>12 - 12 oz jars</QuantityPerUnit>
<UnitPrice>40</UnitPrice>
<UnitsInStock>6</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>0</ReorderLevel>
<Discontinued>false</Discontinued>
</Products>
</Inventory>
← →
just_me (2005-09-29 10:40) [20]> Я делал по аналогии с примером Microsoft
Ну так у тебя схема как раз и соответствует .NET DataSet, никакие ClientDataSet, ADODataSet не помогут. Зато DataSet - запросто
← →
XGarik © (2005-09-29 10:46) [21]just_me
Хорошо, тогда как мне загрузить мой xml-файл в dataset?
← →
XGarik © (2005-09-29 11:12) [22]Может, какие бесплатные компоненты для этого есть! Если у вас есть что-нибудь, то пожалуйста вышлите на мыло!
← →
just_me (2005-09-29 12:10) [23]Посмотри тут:
http://www.agnisoft.com/soap/dotnetsoap.htm
← →
XGarik © (2005-09-29 13:06) [24]
> Посмотри тут:
> http://www.agnisoft.com/soap/dotnetsoap.htm
Ссылка уже битая!
← →
just_me (2005-09-29 14:32) [25]Да ну - перед постом перепроверил
← →
XGarik © (2005-09-29 14:40) [26]А вот теперь все нормально! СПАСИБО! Наверное, сервак отрубали для профилактики!
← →
XGarik © (2005-09-29 21:02) [27]Вопрос остается открытым, т.к. автору уже нечего терять. Все, что было можно я потерял! Мне дали еще пару дней на доведения программы до ума...
У меня просто ничего не выходит с чтением xml секций! Я перепробовал все! У кого есть примеры обработки подобных ситуаций - делитесь! Шлите на мыло или пишите!
← →
dmitry501 © (2005-09-30 05:31) [28]Ну если все так плохо, то может быть стоило поискать в интернете универсальные XML парсеры? Например-
http://delphibase.spb.ru/?action=viewtopic&topic=strparse
http://www.destructor.de/xmlparser/download.htm
http://fundementals.sourceforge.net/cXMLParser.html
наверняка можно найти тот, который справится с Вашими XML файлами.
← →
XGarik © (2005-09-30 11:58) [29]Спасибо! Все скачал и буду пробовать!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.084 c