Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.037 c
4-1125673317
Суслик
2005-09-02 19:01
2005.11.13
Вопрос про GetDC


11-1111437864
thaddy
2005-03-21 23:44
2005.11.13
for stals


2-1129469248
Megabyte
2005-10-16 17:27
2005.11.13
Вопрос по IBX


14-1130049230
SergP.
2005-10-23 10:33
2005.11.13
Посоветуйте стабильный ICQ-клиент


14-1128990736
X-Fi
2005-10-11 04:32
2005.11.13
Creative X-Fi Кто нибудь купил ? Поделитесь мнением ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский