WEBSERVICE - problem z odczytem sekcji

0

Witam.

Piszę w Delphi7 aplikację, która korzysta z WebService'u opartego o protokół SSL.
Korzystam z wielu metod udostępnianych przez ten WebService, ale mam problem z odczytem jednego z węzłów. Poniżej przedstawię kawałek w kodzie XML.
Wspomnę jeszcze, że posiłkuję się programem soapUi, który pozwala na korzystanie z WebService za pomocą plików XML.

Odpowiedz WebService na wywołanie metody getDossier (w programie soapUi) jest następująca:

              <tt_km>
                 <path id="104373">
                    <dossier_id>12756</dossier_id>
                    <trafficperiod_text>codziennie</trafficperiod_text>
                    <references_arrival>false</references_arrival>
                    <agencytype_id>KM</agencytype_id>

<path_section id="1019989">
<path_id>104373</path_id>
<from_op_id>110808</from_op_id>
<national_train_nr>43237</national_train_nr>
<national_trasse_nr>071</national_trasse_nr>
<agency_id>161</agency_id>
<departure>18:36</departure>
<vmax>40</vmax>
<trainlength>600</trainlength>
<trainload>2000</trainload>
<engine_uic_nr>ET22</engine_uic_nr>
<brakepercentage>55</brakepercentage>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>ZABRZEG CZARNOLESIE PO</from_op_name>
</path_section>
<path_section id="1019990">
<path_id>104373</path_id>
<from_op_id>110799</from_op_id>
<agency_id>161</agency_id>
<arrival>19:04</arrival>
<departure>19:48</departure>
<vmax>80</vmax>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>ZEBRZYDOWICE</from_op_name>
</path_section>
<path_section id="1019991">
<path_id>104373</path_id>
<from_op_id>114700</from_op_id>
<agency_id>161</agency_id>
<arrival>20:02</arrival>
<stoptypes>
<stoptype>A</stoptype>
</stoptypes>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>PETROVICE U KARVINE</from_op_name>
</path_section>
<path_section id="1019992">
<path_id>104373</path_id>
<from_op_id>114700</from_op_id>
<national_train_nr>43237</national_train_nr>
<agency_id>201</agency_id>
<departure>22:31</departure>
<vmax>80</vmax>
<trainlength>600</trainlength>
<trainload>2000</trainload>
<engine_uic_nr>163</engine_uic_nr>
<brakepercentage>71</brakepercentage>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>PETROVICE U KARVINE</from_op_name>
</path_section>
<path_section id="1019993">
<path_id>104373</path_id>
<from_op_id>114667</from_op_id>
<agency_id>201</agency_id>
<arrival>23:01</arrival>
<departure>23:22</departure>
<stoptypes>
<stoptype>L</stoptype>
</stoptypes>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>OSTRAVA HLAVNI NADRAZI</from_op_name>
</path_section>
<path_section id="1019994">
<path_id>104373</path_id>
<from_op_id>114732</from_op_id>
<agency_id>201</agency_id>
<arrival>01:35</arrival>
<midnights_arrival>0</midnights_arrival>
<midnights_departure>0</midnights_departure>
<has_emerg_brake_bypass>false</has_emerg_brake_bypass>
<from_op_name>PREROV</from_op_name>
</path_section>

</path>
</tt_km>

Problem dotyczy sekcji <path_section>. Jest ich 6, natomiast WebService nie udostępnia metody, która zwraca wartość wielkości sekcji, dla przykładu kod w Delphi:

Wywołanie metody wygląda następująco:
GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0]
i mogę przy pomocy tej tej metody odczytać dossier_id, trafficperiod_text, references_arrival lub agencytype_i, poprzez:

GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0].dossier_id
GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0].trafficperiod_text, ... itd.

Nie wiem natomiast jak się dobrać do sekcji path_section. Jest ich sześć. Nie ma natomiast dostępnej metody, takie jak, np:

GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0].path_section.Len

Możliwe, że rozwiązaniem tego problemu jest przekazanie całości tablicy TrasseArray[0], czyli 6-ciu path_section do jednej tablicy dynamicznej nie mogę jednak sobie z tym poradzić.
Może też przekazanie odpowiedzi WebService do pliku XML, ale niestety nie wiem w jaki sposób połączyć HTTPRIO z, np XMLDocument?

W dotNecie jest pętla foreach, która przekazuje obiekt do tablicy dynamicznej utworzonej przez programistę, ta natomiast zwraca wielkość tej tablicy.

Mam jeszcze inne pytanie, a o tym później.

Bardzo proszę o pomoc i pozdrawiam.

0

Czesc

A sprawdzales czy istnieje property Count? :

GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0].path_section.Count

Czy mozesz odniesc sie np. do GetDossierResponse.pathfinderintegration.dossier.tt_km.TrasseArray[0].path_section[0].path_id

Poczawszy od Delphi 2007 tez masz "foreach" ale w nieco okrojonej postaci.

Ten HTTPRIO musi miec jakas metode zapisu danych do strumienia a potem to juz z gorki... ;-)

0

Wielkie dzięku za zainteresowanie tematem.

Niestety, ale nie ma property Count. Również nie mogę się odnieść do path_section jako elementu tablicy ( path_section[0] ), bo w pliku inicjującym metody nie jest niestety zapisane jako array.

Postaram się jednak skupić na zapisie strumienia z HTTPRIO, może mi sie uda.
Jeśli chodzi o D2007, to na razie niestety nie dysponuję tą wersją, ale znalazłem gdzieś w necie jak można napisać foreach w Delphi. Jak znajdę, to podzielę się wiedzą.

Pozdrawiam.

0

Bodajze Andreas Hausladen to zaimplementowal ale odradzam Ci w ogole podejmowanie tego tematu. Bo to nie jest tak, ze jak masz dostepne w skladni jezyka foreach to ono bedzie dzialac na kazdym obiekcie czy strukturze. Dany obiekt musi udostepniac kilka metod aby moc poddac sie operacji foreach. W Twoim przypadku oznaczaloby to prawdopodobnie, ze musialbys to sam zaimplementowac w tym komponencie.

Parsowanie strumienia za pomoca XMLDocument wydaje sie najrozsadniejsze o ile nie da sie dostac do iteratora tego obiektu w sposob standardowy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1