From 2d274f589b640c7570e9da22593dd0c0a7419b81 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 28 Nov 2011 11:24:12 +0100 Subject: start switching from HTML to XML mode (parsing works fine, todo: error detection) --- bin/efa | 12 +- lib/Travel/Routing/DE/VRR.pm | 196 +-- lib/Travel/Routing/DE/VRR/Route/Part.pm | 14 +- t/in/e_alf_d_hbf.xml | 2752 +++++++++++++++++++++++++++++++ t/in/e_hbf_mh_hbf.xml | 1208 ++++++++++++++ 5 files changed, 4057 insertions(+), 125 deletions(-) create mode 100644 t/in/e_alf_d_hbf.xml create mode 100644 t/in/e_hbf_mh_hbf.xml diff --git a/bin/efa b/bin/efa index 3dca2cc..60b3d78 100755 --- a/bin/efa +++ b/bin/efa @@ -198,11 +198,13 @@ for my $i ( 0 .. $#routes ) { } printf( - "%-5s ab %-30s %-20s %s\n%-5s an %-30s\n\n", - $c->get( - qw(departure_time departure_stop train_line - train_destination arrival_time arrival_stop) - ), + "%-5s ab %-30s %-20s %s\n%-5s an %s\n\n", + $c->departure_time, + $c->departure_stop_and_platform, + $c->train_line, + $c->train_destination, + $c->arrival_time, + $c->arrival_stop_and_platform, ); } if ( $i != $#routes ) { diff --git a/lib/Travel/Routing/DE/VRR.pm b/lib/Travel/Routing/DE/VRR.pm index e54c8d9..8982a00 100644 --- a/lib/Travel/Routing/DE/VRR.pm +++ b/lib/Travel/Routing/DE/VRR.pm @@ -4,6 +4,7 @@ use strict; use warnings; use 5.010; +use Encode qw(decode); use Travel::Routing::DE::VRR::Route; use LWP::UserAgent; use XML::LibXML; @@ -304,6 +305,7 @@ sub create_post { name_destination => q{}, name_origin => q{}, name_via => q{}, + outputFormat => 'XML', placeInfo_destination => 'invalid', placeInfo_origin => 'invalid', placeInfo_via => 'invalid', @@ -374,116 +376,6 @@ sub create_post { return; } -sub parse_initial { - my ($self) = @_; - - my $tree = $self->{tree} - = XML::LibXML->load_html( string => $self->{html_reply}, ); - - my $con_part = 0; - my $con_no; - my $cons = []; - - my $xp_td = XML::LibXML::XPathExpression->new('//table//table/tr/td'); - my $xp_img = XML::LibXML::XPathExpression->new('./img'); - - foreach my $td ( @{ $tree->findnodes($xp_td) } ) { - - my $colspan = $td->getAttribute('colspan') // 0; - my $class = $td->getAttribute('class') // q{}; - - if ( $colspan != 8 and $class !~ /^bgColor2?$/ ) { - next; - } - - if ( $colspan == 8 ) { - if ( $td->textContent =~ m{ (? \d+ ) [.] .+ Fahrt }x ) { - $con_no = $+{no} - 1; - $con_part = 0; - next; - } - } - - if ( $class =~ /^bgColor2?$/ ) { - if ( $class eq 'bgColor' and ( $con_part % 2 ) == 1 ) { - $con_part++; - } - elsif ( $class eq 'bgColor2' and ( $con_part % 2 ) == 0 ) { - $con_part++; - } - } - - if ( defined $con_no - and not $td->exists($xp_img) - and $td->textContent !~ /^\s*$/ ) - { - push( @{ $cons->[$con_no]->[$con_part] }, $td->textContent ); - } - } - - return $cons; -} - -sub parse_pretty { - my ( $self, $con_parts ) = @_; - - my @elements; - my @next_extra; - - for my $con ( @{$con_parts} ) { - - my $hash; - - # Note: Changes @{$con} elements - foreach my $str ( @{$con} ) { - $str =~ s/[\s\n\t]+/ /gs; - $str =~ s/^ //; - $str =~ s/ $//; - } - - if ( @{$con} < 5 ) { - @next_extra = @{$con}; - next; - } - - # @extra may contain undef values - foreach my $extra (@next_extra) { - if ($extra) { - push( @{ $hash->{extra} }, $extra ); - } - } - @next_extra = undef; - - if ( $con->[0] !~ / \d{2} : \d{2} /ox ) { - splice( @{$con}, 0, 0, q{} ); - splice( @{$con}, 4, 0, q{} ); - $con->[7] = q{}; - } - elsif ( $con->[4] =~ / Plan: \s ab /ox ) { - push( @{ $hash->{extra} }, splice( @{$con}, 4, 1 ) ); - } - - foreach my $extra ( splice( @{$con}, 8, -1 ) ) { - push( @{ $hash->{extra} }, $extra ); - } - - $hash->{departure_time} = $con->[0]; - - # always "ab" $con->[1]; - $hash->{departure_stop} = $con->[2]; - $hash->{train_line} = $con->[3]; - $hash->{arrival_time} = $con->[4]; - - # always "an" $con->[5]; - $hash->{arrival_stop} = $con->[6]; - $hash->{train_destination} = $con->[7]; - - push( @elements, $hash ); - } - - return Travel::Routing::DE::VRR::Route->new(@elements); -} - sub new { my ( $obj, %conf ) = @_; @@ -520,28 +412,94 @@ sub submit { # decode character strings when they have that encoding. However, it # doesn't check for latin-1, which is an alias for iso-8859-1. - $self->{html_reply} = $response->decoded_content( charset => 'latin-1' ); + $self->{xml_reply} = $response->decoded_content; $self->parse(); return; } +sub itddate_str { + my ($self, $node) = @_; + + return sprintf('%02d.%02d.%04d', $node->getAttribute('day'), + $node->getAttribute('month'), $node->getAttribute('year')); +} + +sub itdtime_str { + my ($self, $node) = @_; + + return sprintf('%02d:%02d', $node->getAttribute('hour'), + $node->getAttribute('minute')); +} + +sub parse_part { + my ($self, $tree) = @_; + + my $xp_route = XML::LibXML::XPathExpression->new('./itdPartialRouteList/itdPartialRoute'); + my $xp_dep = XML::LibXML::XPathExpression->new('./itdPoint[@usage="departure"]'); + my $xp_arr = XML::LibXML::XPathExpression->new('./itdPoint[@usage="arrival"]'); + my $xp_date = XML::LibXML::XPathExpression->new('./itdDateTime/itdDate'); + my $xp_time = XML::LibXML::XPathExpression->new('./itdDateTime/itdTime'); +# my $xp_tdate = XML::LibXML::XPathExpression->new('./itdDateTimeTarget/itdDate'); +# my $xp_ttime = XML::LibXML::XPathExpression->new('./itdDateTimeTarget/itdTime'); + my $xp_mot = XML::LibXML::XPathExpression->new('./itdMeansOfTransport'); + + my @route_parts; + + for my $e ( $tree->findnodes($xp_route) ) { + + my $e_dep = ( $e->findnodes($xp_dep) )[0]; + my $e_arr = ( $e->findnodes($xp_arr) )[0]; + my $e_ddate = ( $e_dep->findnodes($xp_date) )[0]; + my $e_dtime = ( $e_dep->findnodes($xp_time) )[0]; + my $e_adate = ( $e_arr->findnodes($xp_date) )[0]; + my $e_atime = ( $e_arr->findnodes($xp_time) )[0]; + my $e_mot = ( $e->findnodes($xp_mot) )[0]; + + my $hash = { + departure_time => $self->itdtime_str($e_dtime), + departure_date => $self->itddate_str($e_ddate), + departure_stop => $e_dep->getAttribute('name'), + departure_platform => $e_dep->getAttribute('platformName'), + train_line => $e_mot->getAttribute('name'), + train_destination => $e_mot->getAttribute('destination'), + arrival_time => $self->itdtime_str($e_atime), + arrival_date => $self->itddate_str($e_adate), + arrival_stop => $e_arr->getAttribute('name'), + arrival_platform => $e_arr->getAttribute('platformName'), + }; + + for my $key (keys %{$hash}) { + $hash->{$key} = decode('UTF-8', $hash->{$key} ); + } + + push(@route_parts, $hash); + } + + push(@{$self->{routes}}, Travel::Routing::DE::VRR::Route->new(@route_parts)); + + return; +} + sub parse { my ($self) = @_; - my $raw_cons = $self->parse_initial; + my $tree = $self->{tree} + = XML::LibXML->load_xml( string => $self->{xml_reply}, ); + + my $xp_element = XML::LibXML::XPathExpression->new('//itdItinerary/itdRouteList/itdRoute'); - for my $raw_con ( @{$raw_cons} ) { - push( @{ $self->{routes} }, $self->parse_pretty($raw_con) ); + for my $part ($tree->findnodes($xp_element)) { + $self->parse_part($part); } - $self->check_ambiguous(); - $self->check_no_connections(); +# $self->check_ambiguous(); +# $self->check_no_connections(); - if ( @{$raw_cons} == 0 ) { - Travel::Routing::DE::VRR::Exception::NoData->throw(); - } +# if ( @{$raw_cons} == 0 ) { +# Travel::Routing::DE::VRR::Exception::NoData->throw(); +# } return 1; } diff --git a/lib/Travel/Routing/DE/VRR/Route/Part.pm b/lib/Travel/Routing/DE/VRR/Route/Part.pm index ee01baf..d01260c 100644 --- a/lib/Travel/Routing/DE/VRR/Route/Part.pm +++ b/lib/Travel/Routing/DE/VRR/Route/Part.pm @@ -9,7 +9,7 @@ use parent 'Class::Accessor'; our $VERSION = '1.06'; Travel::Routing::DE::VRR::Route::Part->mk_ro_accessors( - qw(arrival_stop arrival_time departure_stop departure_time train_line + qw(arrival_platform arrival_stop arrival_time departure_platform departure_stop departure_time train_line train_destination) ); @@ -21,6 +21,18 @@ sub new { return bless( $ref, $obj ); } +sub arrival_stop_and_platform { + my ($self) = @_; + + return sprintf('%s: %s', $self->get(qw(arrival_stop arrival_platform))); +} + +sub departure_stop_and_platform { + my ($self) = @_; + + return sprintf('%s: %s', $self->get(qw(departure_stop departure_platform))); +} + sub extra { my ($self) = @_; diff --git a/t/in/e_alf_d_hbf.xml b/t/in/e_alf_d_hbf.xml new file mode 100644 index 0000000..b788976 --- /dev/null +++ b/t/in/e_alf_d_hbf.xml @@ -0,0 +1,2752 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Essen + Essen + + + Alfredusbad + Alfredusbad + + + + + Düsseldorf + Duesseldorf + + + Hbf + Hbf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zug + S-Bahn + U-Bahn + Stadtbahn + Straßen-/Trambahn + Stadtbus + Regionalbus + Schnellbus + Seil-/Zahnradbahn + Schiff + AST/Rufbus + Sonstige + + + + + + 10 + + + 12 + + + 0 + + + 22 + + + 21 + + + 59 + + + 54 + + + 56 + + + 62 + + + 57 + + + 60 + + + 52 + + + 50 + + + 58 + + + 66 + + + 64 + + + 69 + + + 68 + + + 80 + + + 110 + + + 113 + + + 112 + + + 130 + + + 131 + + + 154 + + + 156 + + + 152 + + + 150 + + + 172 + + + 174 + + + 170 + + + 190 + + + 182 + + + 176 + + + 186 + + + 178 + + + 184 + + + 180 + + + 192 + + + 200 + + + 202 + + + 206 + + + 204 + + + 194 + + + 223 + + + 219 + + + 208 + + + 209 + + + 218 + + + 217 + + + 212 + + + 214 + + + 216 + + + 210 + + + 221 + + + 232 + + + 230 + + + 234 + + + 240 + + + 242 + + + 254 + + + 252 + + + 250 + + + 260 + + + 270 + + + 266 + + + 262 + + + 268 + + + 264 + + + 256 + + + 272 + + + 282 + + + 280 + + + 302 + + + 300 + + + 290 + + + 306 + + + 304 + + + 314 + + + 312 + + + 316 + + + 310 + + + 322 + + + 326 + + + 328 + + + 321 + + + 324 + + + 320 + + + 334 + + + 332 + + + 330 + + + 340 + + + 344 + + + 342 + + + 350 + + + 352 + + + 358 + + + 356 + + + 366 + + + 360 + + + 364 + + + 354 + + + 362 + + + 368 + + + 380 + + + 376 + + + 382 + + + 378 + + + 374 + + + 372 + + + 383 + + + 377 + + + 370 + + + 391 + + + 389 + + + 384 + + + 388 + + + 386 + + + 414 + + + 412 + + + 410 + + + 416 + + + 424 + + + 422 + + + 420 + + + 430 + + + 442 + + + 444 + + + 436 + + + 440 + + + 438 + + + 432 + + + 434 + + + 446 + + + 450 + + + 452 + + + 463 + + + 462 + + + 460 + + + 466 + + + 468 + + + 464 + + + 476 + + + 478 + + + 470 + + + 472 + + + 474 + + + 481 + + + 491 + + + 482 + + + 510 + + + 509 + + + 504 + + + 508 + + + 506 + + + 502 + + + 500 + + + 512 + + + 514 + + + 523 + + + 521 + + + 522 + + + 524 + + + 526 + + + 520 + + + 528 + + + 530 + + + 540 + + + 542 + + + 554 + + + 550 + + + 552 + + + 586 + + + 588 + + + 584 + + + 587 + + + 580 + + + 582 + + + 622 + + + 620 + + + 614 + + + 612 + + + 610 + + + 630 + + + 632 + + + 624 + + + 640 + + + 644 + + + 642 + + + 654 + + + 652 + + + 650 + + + 658 + + + 668 + + + 656 + + + 660 + + + 666 + + + 664 + + + 670 + + + 677 + + + 675 + + + 676 + + + 678 + + + 679 + + + 672 + + + 674 + + + 700 + + + 722 + + + 720 + + + 732 + + + 730 + + + 740 + + + 746 + + + 742 + + + 750 + + + 748 + + + 754 + + + 760 + + + 752 + + + 821 + + + 822 + + + 840 + + + 850 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + EVAG Strab + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361013 + 459590 + + + 3361022 + 459573 + + + 3361030 + 459552 + + + 3361037 + 459544 + + + 3361040 + 459498 + + + 3361046 + 459468 + + + 3361054 + 459459 + + + 3361062 + 459428 + + + 3361075 + 459372 + + + 3361094 + 459301 + + + 3361107 + 459236 + + + 3361111 + 459219 + + + 3361121 + 459169 + + + 3361117 + 459140 + + + 3361123 + 459100 + + + 3361149 + 458995 + + + 3361398 + 457763 + + + 3361505 + 457246 + + + 3361663 + 456905 + + + 3361663 + 456905 + + + 3361700 + 456826 + + + 3361800 + 456643 + + + 3361872 + 456515 + + + 3361894 + 456478 + + + 3361895 + 456477 + + + 3361896 + 456477 + + + 3361896 + 456476 + + + 3361897 + 456475 + + + 3361898 + 456474 + + + 3361899 + 456472 + + + 3361901 + 456471 + + + 3361902 + 456468 + + + 3361904 + 456465 + + + 3361907 + 456462 + + + 3361909 + 456458 + + + 3361912 + 456453 + + + 3361915 + 456448 + + + 3361918 + 456443 + + + 3361922 + 456437 + + + 3361923 + 456436 + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361923 + 456436 + + + 3362045 + 456187 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 452 + + + 350 + + + 342 + + + 340 + + + 330 + + + 332 + + + 434 + + + 432 + + + 430 + + + + + + + 1-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + EVAG Strab + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361013 + 459589 + + + 3360972 + 459664 + + + 3360866 + 459818 + + + 3360820 + 459886 + + + 3360809 + 459902 + + + 3360809 + 459902 + + + 3360799 + 459916 + + + 3360757 + 459982 + + + 3360749 + 460003 + + + 3360655 + 460210 + + + 3360637 + 460258 + + + 3360620 + 460292 + + + 3360554 + 460423 + + + 3360544 + 460448 + + + 3360539 + 460462 + + + 3360539 + 460462 + + + 3360500 + 460567 + + + 3360502 + 460624 + + + 3360516 + 460739 + + + 3360522 + 460798 + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3360524 + 460798 + + + 3360522 + 460798 + + + 3360523 + 460808 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + EVAG Bus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3360523 + 460808 + + + 3360512 + 460901 + + + 3360497 + 460929 + + + 3360464 + 460959 + + + 3360452 + 460965 + + + 3360460 + 460998 + + + 3360451 + 461040 + + + 3360417 + 461103 + + + 3360387 + 461143 + + + 3360366 + 461168 + + + 3360285 + 461237 + + + 3360219 + 461301 + + + 3360171 + 461393 + + + 3360140 + 461497 + + + 3360137 + 461515 + + + 3360137 + 461577 + + + 3360160 + 461636 + + + 3360180 + 461661 + + + 3360225 + 461708 + + + 3360234 + 461733 + + + 3360234 + 461733 + + + 3360238 + 461746 + + + 3360231 + 461889 + + + 3360243 + 461954 + + + 3360254 + 461990 + + + 3360276 + 462030 + + + 3360326 + 462080 + + + 3360353 + 462097 + + + 3360353 + 462097 + + + 3360374 + 462111 + + + 3360387 + 462121 + + + 3360434 + 462176 + + + 3360511 + 462417 + + + 3360539 + 462457 + + + 3360539 + 462457 + + + 3360576 + 462510 + + + 3360593 + 462529 + + + 3360647 + 462620 + + + 3360658 + 462675 + + + 3360658 + 462706 + + + 3360640 + 462791 + + + 3360621 + 462852 + + + 3360603 + 462971 + + + 3360615 + 463085 + + + 3360620 + 463105 + + + 3360672 + 463228 + + + 3360706 + 463306 + + + 3360719 + 463347 + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3360718 + 463347 + + + 3360684 + 463409 + + + + + + + + PlanLowFloorVehicle + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Linie S6: Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 452 + + + 450 + + + 442 + + + 440 + + + 432 + + + 430 + + + + + + + 1-3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + EVAG Strab + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361013 + 459590 + + + 3361022 + 459573 + + + 3361030 + 459552 + + + 3361037 + 459544 + + + 3361040 + 459498 + + + 3361046 + 459468 + + + 3361054 + 459459 + + + 3361062 + 459428 + + + 3361075 + 459372 + + + 3361094 + 459301 + + + 3361107 + 459236 + + + 3361111 + 459219 + + + 3361121 + 459169 + + + 3361117 + 459140 + + + 3361123 + 459100 + + + 3361149 + 458995 + + + 3361398 + 457763 + + + 3361505 + 457246 + + + 3361663 + 456905 + + + 3361663 + 456905 + + + 3361700 + 456826 + + + 3361800 + 456643 + + + 3361872 + 456515 + + + 3361894 + 456478 + + + 3361895 + 456477 + + + 3361896 + 456477 + + + 3361896 + 456476 + + + 3361897 + 456475 + + + 3361898 + 456474 + + + 3361899 + 456472 + + + 3361901 + 456471 + + + 3361902 + 456468 + + + 3361904 + 456465 + + + 3361907 + 456462 + + + 3361909 + 456458 + + + 3361912 + 456453 + + + 3361915 + 456448 + + + 3361918 + 456443 + + + 3361922 + 456437 + + + 3361923 + 456436 + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361923 + 456436 + + + 3362045 + 456187 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 452 + + + 350 + + + 342 + + + 340 + + + 330 + + + 332 + + + 434 + + + 432 + + + 430 + + + + + + + 1-3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + EVAG Strab + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361013 + 459590 + + + 3361022 + 459573 + + + 3361030 + 459552 + + + 3361037 + 459544 + + + 3361040 + 459498 + + + 3361046 + 459468 + + + 3361054 + 459459 + + + 3361062 + 459428 + + + 3361075 + 459372 + + + 3361094 + 459301 + + + 3361107 + 459236 + + + 3361111 + 459219 + + + 3361121 + 459169 + + + 3361117 + 459140 + + + 3361123 + 459100 + + + 3361149 + 458995 + + + 3361398 + 457763 + + + 3361505 + 457246 + + + 3361663 + 456905 + + + + + + + DHDN_RAUENBERG_BESSEL_1841 + PROJECTION_MDV + + + 3361923 + 456436 + + + 3362045 + 456187 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 452 + + + 350 + + + 340 + + + 330 + + + 332 + + + 434 + + + 432 + + + 430 + + + + + + + 1-2 + + + + + + + diff --git a/t/in/e_hbf_mh_hbf.xml b/t/in/e_hbf_mh_hbf.xml new file mode 100644 index 0000000..8db323f --- /dev/null +++ b/t/in/e_hbf_mh_hbf.xml @@ -0,0 +1,1208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Essen + Essen + + + Hauptbahnhof + hbf + + + + + Mülheim a.d. Ruhr + mh + + + Hbf + Hbf + + + Hbf + Hauptbahnhof Nordeingang + Kaiserplatz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zug + S-Bahn + U-Bahn + Stadtbahn + Straßen-/Trambahn + Stadtbus + Regionalbus + Schnellbus + Seil-/Zahnradbahn + Schiff + AST/Rufbus + Sonstige + + + + + + 10 + + + 12 + + + 0 + + + 22 + + + 21 + + + 59 + + + 54 + + + 56 + + + 62 + + + 57 + + + 60 + + + 52 + + + 50 + + + 58 + + + 66 + + + 64 + + + 69 + + + 68 + + + 80 + + + 110 + + + 113 + + + 112 + + + 130 + + + 131 + + + 154 + + + 156 + + + 152 + + + 150 + + + 172 + + + 174 + + + 170 + + + 190 + + + 182 + + + 176 + + + 186 + + + 178 + + + 184 + + + 180 + + + 192 + + + 200 + + + 202 + + + 206 + + + 204 + + + 194 + + + 223 + + + 219 + + + 208 + + + 209 + + + 218 + + + 217 + + + 212 + + + 214 + + + 216 + + + 210 + + + 221 + + + 232 + + + 230 + + + 234 + + + 240 + + + 242 + + + 254 + + + 252 + + + 250 + + + 260 + + + 270 + + + 266 + + + 262 + + + 268 + + + 264 + + + 256 + + + 272 + + + 282 + + + 280 + + + 302 + + + 300 + + + 290 + + + 306 + + + 304 + + + 314 + + + 312 + + + 316 + + + 310 + + + 322 + + + 326 + + + 328 + + + 321 + + + 324 + + + 320 + + + 334 + + + 332 + + + 330 + + + 340 + + + 344 + + + 342 + + + 350 + + + 352 + + + 358 + + + 356 + + + 366 + + + 360 + + + 364 + + + 354 + + + 362 + + + 368 + + + 380 + + + 376 + + + 382 + + + 378 + + + 374 + + + 372 + + + 383 + + + 377 + + + 370 + + + 391 + + + 389 + + + 384 + + + 388 + + + 386 + + + 414 + + + 412 + + + 410 + + + 416 + + + 424 + + + 422 + + + 420 + + + 430 + + + 442 + + + 444 + + + 436 + + + 440 + + + 438 + + + 432 + + + 434 + + + 446 + + + 450 + + + 452 + + + 463 + + + 462 + + + 460 + + + 466 + + + 468 + + + 464 + + + 476 + + + 478 + + + 470 + + + 472 + + + 474 + + + 481 + + + 491 + + + 482 + + + 510 + + + 509 + + + 504 + + + 508 + + + 506 + + + 502 + + + 500 + + + 512 + + + 514 + + + 523 + + + 521 + + + 522 + + + 524 + + + 526 + + + 520 + + + 528 + + + 530 + + + 540 + + + 542 + + + 554 + + + 550 + + + 552 + + + 586 + + + 588 + + + 584 + + + 587 + + + 580 + + + 582 + + + 622 + + + 620 + + + 614 + + + 612 + + + 610 + + + 630 + + + 632 + + + 624 + + + 640 + + + 644 + + + 642 + + + 654 + + + 652 + + + 650 + + + 658 + + + 668 + + + 656 + + + 660 + + + 666 + + + 664 + + + 670 + + + 677 + + + 675 + + + 676 + + + 678 + + + 679 + + + 672 + + + 674 + + + 700 + + + 722 + + + 720 + + + 732 + + + 730 + + + 740 + + + 746 + + + 742 + + + 750 + + + 748 + + + 754 + + + 760 + + + 752 + + + 821 + + + 822 + + + 840 + + + 850 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Linie S3: Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 350 + + + 342 + + + + + + + 1-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 350 + + + 342 + + + + + + + 1-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 350 + + + 342 + + + + + + + 1-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00 + Daten DB AG + + + + + Linie S1: Achtung! Baumaßnahmen. Infos: www.bahn.de/bauarbeiten + Linie S1: Fahrradmitnahme begrenzt möglich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 350 + + + 342 + + + + + + + 1-1 + + + + + + + -- cgit v1.2.3