Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Обращение к полю 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&#237;a</CompanyName>
 <ContactName>Antonio Moreno</ContactName>
 <ContactTitle>Owner</ContactTitle>
 <Address>Mataderos  2312</Address>
 <City>M&#233;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&#234;mes d&#233;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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.046 c
14-1130218128
Ega23
2005-10-25 09:28
2005.11.13
С днем рождения! 25 октября


4-1125746538
psa247
2005-09-03 15:22
2005.11.13
DeleteMenu


14-1130069324
Nikolay M.
2005-10-23 16:08
2005.11.13
Питьевые качества 5-летнего коньяка в алюминиевой фляжке - ?


2-1129787961
Green-Templar
2005-10-20 09:59
2005.11.13
random(2)*2


14-1129884103
TButton
2005-10-21 12:41
2005.11.13
глючит звук