Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > как такое пропарсить?


Автор: DYUMON 20.11.2008, 11:55
Пишу импортер из xml файла. раньше не работал с xml файлами. файл легко парсится с использованием компонентов баз данных. но мне надо содержимое вывести в listview. 
пробовал simpleXML и стандартный парсер с вкладки internet результат 0.
пример файла 

Код

<?xml version="1.0" encoding="windows-1251" standalone="yes"?>  <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="CLNT_LIST_CODE" fieldtype="i4"/><FIELD attrname="CLNT_LIST_NAME" fieldtype="string" WIDTH="80"/><FIELD attrname="PLST_HEAD_DATE" fieldtype="date"/><FIELD attrname="PROD_LIST_CODE" fieldtype="i4"/><FIELD attrname="PROD_LIST_NUMB" fieldtype="i4"/><FIELD attrname="PROD_LIST_NAME" fieldtype="string" WIDTH="80"/><FIELD attrname="PRSV_LIST_NAME" fieldtype="string" WIDTH="80"/><FIELD attrname="PGRP_LIST_NAME" fieldtype="string" WIDTH="80"/><FIELD attrname="PLST_LINE_PACK" fieldtype="string" WIDTH="30"/><FIELD attrname="PLST_LINE_DATE" fieldtype="date"/><FIELD attrname="PLST_LINE_PRC1" fieldtype="fixedFMT" DECIMALS="2" WIDTH="15"/><FIELD attrname="USL_PRICE" fieldtype="string" WIDTH="30"/><FIELD attrname="QNTY" fieldtype="i4"/></FIELDS><PARAMS LCID="0"/></METADATA><ROWDATA><ROW CLNT_LIST_CODE="1001" CLNT_LIST_NAME="РИА ПАНДА-НОВОСИБИРСК" PLST_HEAD_DATE="20081118" PROD_LIST_CODE="8299" PROD_LIST_NUMB="9238" PROD_LIST_NAME="LA FEMME ELEGANTE МАТИРУЮЩАЯ ЭМУЛЬСИЯ ДЛЯ Ж/КОМБИНИРОВАННОЙ КОЖИ 75 МЛ" PRSV_LIST_NAME="ВИТА ХБО ПРИ РАН ООО" PGRP_LIST_NAME="КОСМЕТИКА" PLST_LINE_PACK="34" PLST_LINE_DATE="20090101" PLST_LINE_PRC1="86.52" USL_PRICE="ИНДИВИДУАЛЬНОЕ" QNTY="0"/><ROW CLNT_LIST_CODE="1001" CLNT_LIST_NAME="РИА ПАНДА-НОВОСИБИРСК" PLST_HEAD_DATE="20081118" PROD_LIST_CODE="7399" PROD_LIST_NUMB="8245" PROD_LIST_NAME="ФИТОЧАЙ ФИТОЛЮКС-32 ФИТОВИТАМИН С ЛЕСНЫМИ ЯГОДАМИ 50 Г" PRSV_LIST_NAME="НАРОДНАЯ МЕДИЦИНА МК ООО" PGRP_LIST_NAME="БАД, ЛЕЧЕБНОЕ ПИТАНИЕ" PLST_LINE_PACK="60" PLST_LINE_DATE="20090201" PLST_LINE_PRC1="21.85" USL_PRICE="ИНДИВИДУАЛЬНОЕ" QNTY="0"/><ROW CLNT_LIST_CODE="1001" CLNT_LIST_NAME="РИА ПАНДА-НОВОСИБИРСК" PLST_HEAD_DATE="20081118" PROD_LIST_CODE="8803" PROD_LIST_NUMB="9688" PROD_LIST_NAME="НАБОР ПОДАРОЧНЫЙ МЭТР (КРЕМ Д/БРИТЬЯ, ГЕЛЬ П/БРИТЬЯ, ШАМПУНЬ УКРЕПЛ.)" PRSV_LIST_NAME="ВИТА ХБО ПРИ РАН ООО" PGRP_LIST_NAME="КОСМЕТИКА" PLST_LINE_PACK="6" PLST_LINE_DATE="20100201" PLST_LINE_PRC1="114.71" USL_PRICE="ИНДИВИДУАЛЬНОЕ" QNTY="0"/><ROW CLNT_LIST_CODE="1001" CLNT_LIST_NAME="РИА ПАНДА-НОВОСИБИРСК" PLST_HEAD_DATE="20081118" PROD_LIST_CODE="8814" PROD_LIST_NUMB="9738" PROD_LIST_NAME="НАБОР ПОДАРОЧНЫЙ МЭТР (КРЕМ Д/БРИТЬЯ, ГЕЛЬ П/БРИТЬЯ, ГЕЛЬ Д/ДУША)" PRSV_LIST_NAME="ВИТА ХБО ПРИ РАН ООО" PGRP_LIST_NAME="КОСМЕТИКА" PLST_LINE_PACK="6" PLST_LINE_DATE="20100201" PLST_LINE_PRC1="113.31" USL_PRICE="ИНДИВИДУАЛЬНОЕ" QNTY="0"/></ROWDATA></DATAPACKET>

может кто нибудь обьяснит как это правильно пропарсить?

Автор: pseud 20.11.2008, 14:44
"делай раз"
судя по содержимому - это выгрузка из наследника ClientDataSet поэтому:
1. новая форма
2. на форму TClientDataSet, TDataSource, TDBGrid
3. в дизайне:
Код

DataSource1.DataSet = ClientDataSet1;
DBGrid1.DataSource = DataSource1;

4. в коде в Form.OnCreate или Button.OnClick:
Код

ClientDataSet1.LoadFromFile('D:\qqq\qqq\qqq\qqq\qqq.xml'); 


http://ipicture.ru/

Оно?  smile 

Автор: DYUMON 21.11.2008, 07:01
Спасибо но с утра сам разобрался. сделал загрузку в listview
Код

 XMLDoc:= xm.Create(nil);
 xmldoc.LoadFromFile(opendialog1.FileName);
  xmldoc.Active:=true;
 anElem:=xmldoc.DocumentElement;
for i:=0 to anElem.ChildNodes['ROWDATA'].ChildNodes.Count-1 do
begin
listview.Items.Add.Caption:=anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['CLNT_LIST_CODE'];
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['CLNT_LIST_NAME']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PLST_HEAD_DATE']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PROD_LIST_CODE']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PROD_LIST_NUMB']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PROD_LIST_NAME']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PRSV_LIST_NAME']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PGRP_LIST_NAME']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PLST_LINE_PACK']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PLST_LINE_DATE']) );
 Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['PLST_LINE_PRC1']) );
  Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['USL_PRICE']) );
  Listview.Items[Listview.Items.Count-1].SubItems.add(string(anElem.ChildNodes['ROWDATA'].ChildNodes[i].Attributes['QNTY']) );

хоть коряво но работает. 
а про  ClientDataSet я знаю раньше пользовался этим 
щас нужно было именно listview

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