post.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
чтение из *.xml
niktool
Отправлено: 02.03.2007, 17:11


Ученик-кочегар

Группа: Участник
Сообщений: 6



Доброго вемени суток всем,!
Помогите решить проблему!
У меня имеются *.xml файлы со следующими данными:

-
-
0215FGDFG46511
АUFGDF
3DFGDF5
2.DFGDF5
EFGАUR
-
ECАКЕ
FDJHKMD
Mura
7F8512564376
-
SUFF1007261
SDF
RUFD
-
FDG0320945
2ID810313
322FFGGL0
0521394
V 04.94
V 05.90
1
01/MAR/2007 00:00:00
01/MAR/2007 00:00:00
-
ER5503
15FDG0
1FGD
O9FGD01
0GFDG




-
EdfKJKLC
JJNJNFKJF
Dmitrii
HJGGDLLDF
-
KLJDJKJF
MRDFD
RUDFW
-
24545415241
PGLDF742532
6DWR030
0524942
V 05.11
V 05.11
1
01/MAR/2007 00:00:00
01/MAR/2007 00:00:00
-
54GDF01
21FGDF0
1GDF
5469473
I0DFGF20
0




-
EC
MoFGFDFDFisFG
AFGDFG
GFD53610701
-
SUgf1007274
SGFHGgW
RU
-
3FGHGHFGH25201GFH172
MUI183450
32HGFH50
053GFHG9011
GFHFG
GHF
1
GHFGGFHFGHFG
GFHFGHFGHFGH00
-
5GFHFGHFG3
15FGHFGHFG0
1GFHFGH
O9GFHFGH01
0GF






мне нужно из этого *.xml файла вытащить нужные мне строки и избавиться от тегов,
к примеру из файла вывести все строки ********* и удалить из выведенных строк теги

не могу допетрить как (((.
niktool
Отправлено: 02.03.2007, 17:20


Ученик-кочегар

Группа: Участник
Сообщений: 6



Доброго вемени суток всем,!
Теги на форуме ружуться, заменил "<" , ">" на "*"

Помогите решить проблему!
У меня имеются *.xml файлы со следующими данными:
*?xml version="1.0" encoding="windows-1251" ?*
- *REPAIRDATA TIMESTAMP="01.03.07 19:26:43" grgrgerger*
-
*SC01*0215FGDFG46511*/SC01*
*SC02*АUFGDF*/SC02*
*SC03*3DFGDF5*/SC03*
*SC04*2.DFGDF5*/SC04*
*SC05*EFGАUR*/SC05*
мне нужно из этого *.xml файла вытащить нужные мне строки и избавиться от тегов,
к примеру из файла вывести все строки *SC02*ggdffdgfg*/SC02* и удалить из выведенных строк теги
*SC02**/SC02*
не могу допетрить как (((.
AVC
Отправлено: 02.03.2007, 18:22


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

не могу допетрить как

1. Ишем первый *sc02*, запоминаем позицию в p0
2. Ишем первый */sc02*, запоминаем позицию в p1
3. Искомый результат между p0 + длина(*sco2*) и p1 копируем в приемник.
4. Вход становится на p1 + + длина(*/sco2*)
5. Переход к 1 если вход не кончился.
Doga
Отправлено: 02.03.2007, 19:30


Мастер участка

Группа: Участник
Сообщений: 575



Мне кажется, проще воспользоваться стандартным XML-парсером, напр.
TXMLDocument на вкладке Internet, TjanXMLParser2 (см. в нете), TJvSimpleXML (см. в нете), или вообще напрямую использовать какой-нибудь XML*.DLL

Отредактировано Doga — 02.03.2007, 19:41
AVC
Отправлено: 03.03.2007, 09:09


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Doga @ 02.03.2007, 18:30)
Мне кажется, проще воспользоваться стандартным XML-парсером ...

Мне то же, ну а вдруг человеку хочется поработать руками smile.gif
olegenty
Отправлено: 03.03.2007, 09:46


Ветеран

Группа: Модератор
Сообщений: 2412



лично меня TXMLDocument очень не вставил. предпочёл ему TjanXMLParser2. последний, конечно не безгрешен, но всё же более функционален и удобен (например, в отличие от TXMLDocument, поддерживает XPath). а вообще, есть мнение, что если не работал ни с одним парсером, то лучше сразу использовать какой-нибудь бесплатный парсер типа expat (http://sourceforge.net/projects/expat/).
niktool
Отправлено: 03.03.2007, 13:16


Ученик-кочегар

Группа: Участник
Сообщений: 6



Если не сложно приведите небольшой пример, как пользоваться TXMLDocument или TjanXMLParser2 или еще чего нибудь..
у меня маловато опыта и знаний в Builder C++
почитал доки по TXMLDocument .... для меня сложновато без примеров ((
я до этого написал программку формирования xml отечета... проблем не составило, использовал несложные средства ......
Если не трудно помогите примером
niktool
Отправлено: 05.03.2007, 02:13


Ученик-кочегар

Группа: Участник
Сообщений: 6



решил воспользоваться
XMLDocument1


void __fastcall TForm1::Button1Click(TObject *Sender)
{

XMLDocument1->XML->LoadFromFile("R044_473585160207193520.xml");

XMLDocument1->Active = true;

_di_IXMLNode SERVICECENTER = XMLDocument1->ChildNodes->FindNode(WideString( "SERVICECENTER " ) );

_di_IXMLNode SC01 = SERVICECENTER->GetChildNodes()->FindNode( WideString( "SC01" ) );

Label1->Caption = SC01->GetText();
}

выдает ошибку чтения... ((
отладчик указывает на строку
_di_IXMLNode SC01 = SERVICECENTER->GetChildNodes()->FindNode( WideString( "SC01" ) );

помогите разобраться, в чем прицина !


*?xml version="1.0" encoding="windows-1251" ?*
- *REPAIRDATA TIMESTAMP="01.03.07 19:26:43" grgrgerger*
- *SERVICECENTER*
*SC01*0215FGDFG46511*/SC01*
*SC02*АUFGDF*/SC02*
- *CUSTOMER*
*SC03*3DFGDF5*/SC03*
*SC04*2.DFGDF5*/SC04*
*SC05*EFGАUR*/SC05*
Rius
Отправлено: 05.03.2007, 07:39


Мастер участка

Группа: Участник
Сообщений: 321



юзайте теги [ html ] [ /html ]
HTML
<?xml version="1.0" encoding="utf-8"?>
<AppOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DevicesListView>Tile</DevicesListView>
</AppOptions>

попробуйте
CODE
_di_IXMLNode Root = XMLDocument1->DocumentElement;
_di_IXMLNode ServiceCenter = Root->ChildNodes->Nodes[WideString( "SERVICECENTER" ) ];
_di_IXMLNode SC01 = ServiceCenter->ChildNodes->Nodes[WideString( "SC01" ) ];


Отредактировано Rius — 05.03.2007, 10:46
niktool
Отправлено: 05.03.2007, 10:28


Ученик-кочегар

Группа: Участник
Сообщений: 6



Спасибо,
Rius!!
Все отлично работает!!


void __fastcall TForm1::Button1Click(TObject *Sender)
{

XMLDocument1->XML->LoadFromFile("R044_473585060107171026.xml");
XMLDocument1->Active = true;

_di_IXMLNode Root = XMLDocument1->DocumentElement;
_di_IXMLNode ServiceCenter = Root->ChildNodes->Nodes[WideString( "SERVICECENTER" ) ];
_di_IXMLNode SC01 = ServiceCenter->ChildNodes->Nodes[WideString( "SC01" ) ];
_di_IXMLNode CUSTOMER = ServiceCenter->ChildNodes->Nodes[WideString( "CUSTOMER" ) ];
_di_IXMLNode CU02 = CUSTOMER->ChildNodes->Nodes[WideString( "CU02" ) ];


_di_IXMLNode WORKORDER = CUSTOMER->ChildNodes->Nodes[WideString( "WORKORDER" ) ];
_di_IXMLNode WO02 = WORKORDER->ChildNodes->Nodes[WideString( "WO02" ) ];



_di_IXMLNode PHONE = WORKORDER->ChildNodes->Nodes[WideString( "PHONE" ) ];
_di_IXMLNode PH01 = PHONE->ChildNodes->Nodes[WideString( "PH01" ) ];



_di_IXMLNode REPAIRROW = PHONE->ChildNodes->Nodes[WideString( "REPAIRROW" ) ];
_di_IXMLNode RL04 = REPAIRROW->ChildNodes->Nodes[WideString( "RL04" ) ];

Появилась еще одна трудность для меня...... времени маловато для эксперементов


*?xml version="1.0" encoding="windows-1251" ?*
- *REPAIRDATA TIMESTAMP="01.03.07 19:26:43" grgrgerger*
- *SERVICECENTER*
*SC01*0215FGDFG46511*/SC01*
*SC02*АUFGDF*/SC02*
- *CUSTOMER*
*SC03*3DFGDF5*/SC03*
*SC04*2.DFGDF5*/SC04*
*SC05*EFGАUR*/SC05*
*/CUSTOMER*
*CUSTOMER*
*SC03*3DFGDF5*/SC03*
*SC04*2.DFGDF5*/SC04*
*SC05*EFGАUR*/SC05*
*/CUSTOMER*


Появилась еще одна проудность по *CUSTOMER*

_di_IXMLNode CUSTOMER = ServiceCenter->ChildNodes->Nodes[WideString( "CUSTOMER" ) ];
_di_IXMLNode CU02 = CUSTOMER->ChildNodes->Nodes[WideString( "CU02" ) ];
Вибирается конечно только первый CUSTOMER
Как считать второй CUSTOMER?

Вернуться в Вопросы программирования в C++Builder