# XML mit Namespace prefix (ALT: Sonderzeichen in diversen XML Knoten ersetzen)



## Spelmann (23. April 2015)

Hallo,
ich versuche gerade ein XML von mobile.de auszulesen.
Die Benennung der Knoten ist allerdings problematisch. Sie enthalten Doppelpunkte und Minuszeichen, die mir beim Auslesen via simpleXML Probleme bereiten.

So sieht das XML aus:

```
<search:search-result xmlns:resource="http://services.mobile.de/schema/resource" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:seller="http://services.mobile.de/schema/seller" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
    <search:total>33</search:total>
    <search:page-size>20</search:page-size>
    <search:current-page>1</search:current-page>
    <search:max-pages>2</search:max-pages>
    <search:ads>
        <ad:ad key="123456789" url="https://services.mobile.de/search-api/ad/123456789">
            <ad:creation-date value="2014-05-14T12:54:24+02:00"/>
            <ad:modification-date value="2015-03-14T13:17:18+01:00"/>
            <ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-golf-vi-1-4-tsi-comfortline.html"/>
            <ad:vehicle>
                <ad:class key="Car" url="https://services.mobile.de/refdata/classes/Car">
                    <resource:local-description xml-lang="de">Pkw</resource:local-description>
                </ad:class>
                <ad:category key="Limousine" url="https://services.mobile.de/refdata/categories/Limousine">
usw.
```

Mein Versuch einen Wert auszugeben:

```
$path ="/search:search-result/search:ads/ad:ad[@key=".$id."]/ad:vehicle/ad:make";
    if (!$res = $xml->xpath($path))
        {
        echo "Artikel nicht vorhanden!";
        }else {
        echo "<h1>".$res[0]->resource:local-description."</h1>";
    }
```
will ich den Knoten ad:class > resource:local-description auslesen,
bekomme ich eine Fehlermeldung da *resource:local-description* ja so nicht stehen darf.
*(Parse error*: syntax error, unexpected ':', expecting ',' or ';' in *C:\xampp...)*

Kann mir jemand auf die Sprünge helfen, wie ich in einem Rutsch bei allen Knoten den Doppelpunkt und das Minuszeichen in einen Unterstrich wandeln kann? Gibts da eine Kombination aus regulärem Ausdruck und replace?

Vielen Dank!


----------



## saftmeister (24. April 2015)

DOMDocument kommt mit Namespaces klar. Wenn du ein komplettes XML postest, kann man sogar ein Beispiel erstellen.

Ok, ich hab mal anhand der vorhandenen XML-Daten ein kleines Script erstellt, mit dem du experimentieren kannst. Vieles kannst du der Dokumentation für DOMDocument entnehmen. Die mobile.xml enthält die Daten, die du gepostet hast, allerdings wohlgeformt abgeschlossen (siehe unten)


```
<?php
$doc = new DOMDocument();
$doc->load('mobile.xml');

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//resource:local-description');

foreach($nodes as $node) {

  echo "Text-Inhalt: {$node->textContent}\n";
  foreach ($node->attributes as $attribute) {
  echo "Attribute {$attribute->name}: " . $node->getAttribute($attribute->name) . "\n";
  }
}
```


```
<?xml version="1.0" encoding="UTF-8"?>
<search:search-result xmlns:resource="http://services.mobile.de/schema/resource" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:seller="http://services.mobile.de/schema/seller" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
  <search:total>33</search:total>
  <search:page-size>20</search:page-size>
  <search:current-page>1</search:current-page>
  <search:max-pages>2</search:max-pages>
  <search:ads>
  <ad:ad key="123456789" url="https://services.mobile.de/search-api/ad/123456789">
  <ad:creation-date value="2014-05-14T12:54:24+02:00"/>
  <ad:modification-date value="2015-03-14T13:17:18+01:00"/>
  <ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-golf-vi-1-4-tsi-comfortline.html"/>
  <ad:vehicle>
  <ad:class key="Car" url="https://services.mobile.de/refdata/classes/Car">
  <resource:local-description xml-lang="de">Pkw</resource:local-description>
  </ad:class>
  <ad:category key="Limousine" url="https://services.mobile.de/refdata/categories/Limousine">
  </ad:category>
  </ad:vehicle>
  </ad:ad>
  </search:ads>
</search:search-result>
```

Ausgabe:


```
Text-Inhalt: Pkw
Attribute xml-lang: de
```


----------



## mermshaus (25. April 2015)

Ansonsten:


```
echo "<h1>".$res[0]->{'resource:local-description'}."</h1>";
```

Zumindest prinzipiell. Ob das im hier vorgestellten Fall so exakt richtig ist, habe ich nicht getestet.


----------



## Spelmann (25. April 2015)

Vielen Dank für die Mühe, die Du Dir gemacht hast saftmeister!
An deinem Beispiel kann ich mich jetzt gut abarbeiten. Wenn ich zurechtkomme setze ich das Projekt vielleicht wirklich mit DOM um. Hab mich da nicht so rangetraut. SimpleXML sieht, wie der Name schon sagt, eben doch einfacher aus (ist mein erster Versuch XML Daten zu verarbeiten).

@mermshaus
Diese Schreibweise hab ich inzwischen auch gefunden, dennoch bekomme ich bis jetzt auch mit dieser Methode kein Ergebnis. Es gibt keine Fehlermeldung. Es wird einfach nichts angezeigt. Aber auch hier werde ich noch experimentieren.


----------



## mermshaus (26. April 2015)

Wenn du das XML in einer Form postest, die man 1:1 copy-und-pasten kann, friemel ich es dir mit SimpleXML zurecht.

Es wird wohl das hier sein: http://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml (registerXPathNamespace)

Ich denke, das wirst du im Zweifel auch ohne Hilfe hinbekommen.


----------



## Spelmann (26. April 2015)

Hi mermshaus, das wär super nett!!! Im Moment stehe ich aber noch vor einem anderem Problem im Zusammenhang mit dieser XML.
Die Daten werden nämlich nicht als File*.xml* bereitgestellt sondern als ReST Schnittstelle, die das Senden eines Headers mit zwei Anmeldeinformationen erfordert. Siehe hier:
https://www.tutorials.de/threads/header-authorization-fuer-reest-schnittstelle.401308/
Ich steh da, wie ein blutiger Anfänger


----------



## saftmeister (26. April 2015)

DOMDocument kann auch XML aus einem String laden: http://php.net/manual/de/domdocument.loadxml.php


----------



## mermshaus (26. April 2015)

(Sorry, hatte nicht gesehen, dass @saftmeister bereits eine einfach kopierbare XML-Datei gepostet hatte. Habe die dann mal genommen.)

Jedenfalls: Ich habe wieder gemerkt, warum ich SimpleXML niemals freiweillig verwende und immer die Nutzung von DOM empfehle. Es gibt zu viele Dinge in SimpleXML, die nicht so gestaltet sind oder funktionieren, wie ich das von einer „normalen“ Klasse erwarte.

Das liegt beispielsweise daran, dass Instanzen von SimpleXMLElement, der zentralen Klasse in SimpleXML, vielleicht gar keine echten Objekte sind.

- http://php.net/manual/en/class.simplexmlelement.php#100811

Ich habe gerade nicht die Lust, mich damit tiefgreifender zu befassen, aber der Gedanke, dass SimpleXML-„Objekte“ Fähigkeiten haben, die normale Objekte, wie man sie selbst im Rahmen der PHP-Syntax generieren könnte, nicht haben können, ist mir auch schon mehrfach gekommen. Ich weiß aber spontan kein überzeugendes Beispiel.

Wie auch immer:


```
<?php

$xml = simplexml_load_string(<<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<search:search-result xmlns:resource="http://services.mobile.de/schema/resource" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:seller="http://services.mobile.de/schema/seller" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
    <search:total>33</search:total>
    <search:page-size>20</search:page-size>
    <search:current-page>1</search:current-page>
    <search:max-pages>2</search:max-pages>
    <search:ads>
        <ad:ad key="123456789" url="https://services.mobile.de/search-api/ad/123456789">
            <ad:creation-date value="2014-05-14T12:54:24+02:00"/>
            <ad:modification-date value="2015-03-14T13:17:18+01:00"/>
            <ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-golf-vi-1-4-tsi-comfortline.html"/>
            <ad:vehicle>
                <ad:class key="Car" url="https://services.mobile.de/refdata/classes/Car">
                    <resource:local-description xml-lang="de">Pkw</resource:local-description>
                </ad:class>
                <ad:category key="Limousine" url="https://services.mobile.de/refdata/categories/Limousine">
                </ad:category>
            </ad:vehicle>
        </ad:ad>
    </search:ads>
</search:search-result>
EOT
);

$id = '123456789';

$path = "/search:search-result/search:ads/ad:ad[@key=".$id."]/ad:vehicle/ad:class"; // War ganz hinten ad:make

if (!$res = $xml->xpath($path)) {
    echo "Artikel nicht vorhanden!";
} else {
    var_dump($res[0]->children('resource', true)->{'local-description'});
}
```

Das ist nicht die geschickteste Variante, was den Umgang mit XML-Namespaces angeht. Aber mach es im Zweifel so, wenn du bei SimpleXML bleiben möchtest. Die geschicktere Handhabung ist sehr umständlich.



Ich führe sie dennoch auf:


```
$xml = simplexml_load_string(<<<EOT
...
EOT
);

$namespaces = array(
    'xsearch'   => 'http://services.mobile.de/schema/search',
    'xad'       => 'http://services.mobile.de/schema/ad',
    'xresource' => 'http://services.mobile.de/schema/resource'
);

foreach ($namespaces as $prefix => $ns) {
    $xml->registerXPathNamespace($prefix, $ns);
}

$id = '123456789';

$path = "/xsearch:search-result/xsearch:ads/xad:ad[@key=".$id."]/xad:vehicle/xad:class"; // War ganz hinten ad:make

if (!$res = $xml->xpath($path)) {
    echo "Artikel nicht vorhanden!";
} else {
    var_dump($res[0]->children($namespaces['xresource'])->{'local-description'});
}
```

Das „x“ zu Beginn der lokalen Namespace-Präfixe kann entfernt werden. Ich habe das für den Beispielcode hinzugefügt, um zu verdeutlichen, dass es sich um lokale Aliase handelt, die nicht den Namespace-Präfixen aus der XML-Datei entsprechen müssen (aber können).

Der Vorteil dieser Variante ist, dass der Code auch dann noch funktioniert, wenn sich in der XML-Datei die Namespace-Präfixe ändern sollten. Die wird der Anbieter wahrscheinlich niemals ändern, weil die sich auch denken können, wie Leute ihren Code schreiben, aber es wäre wohl durchaus legitim, das zu tun.

Das hier…


```
var_dump($res[0]->children('xresource', true)->{'local-description'});
```

…funktioniert meines Wissens allerdings _nicht_. (Doku)

Der Grund dafür scheint zu sein, dass SimpleXMLElement::registerXPathNamespace nur für die jeweilige Instanz von SimpleXMLElement Namespaces registriert und dass diese Namespaces auch nur für SimpleXMLElement::xpath-Aufrufe gelten.



DOM handhabt derlei Dinge meiner Erfahrnung nach geschickter. Auch dort gibt es zwar Dinge, die eigenartig sind, aber meiner Meinung nach ist die Syntax und die Verhaltensweise der DOM-Klassen grundsätzlich sehr viel nachvollziehbarer.


----------



## mermshaus (4. Mai 2015)

Hier noch eine Variante mit DOM (aus einem aktuellen Thread auf phpforum.de).

Ich gebe zu, so viel gibt sich das nicht. (Das hatte ich anders in Erinnerung.) Ich würde dennoch DOMDocument und DOMXPath vorziehen. 


```
<?php

$data = <<<EOT
<SearchResultResponse
  xmlns="urn:veloconnect:catalog-1.1"
  xmlns:vco="urn:veloconnect:order-1.1"
  xmlns:vct="urn:veloconnect:transaction-1.0"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0"
>
    <vct:BuyersID>MeineFirma</vct:BuyersID>
    <vct:ResponseCode>200</vct:ResponseCode>
    <vct:TransactionID>e644275f-b3f2-4b6c-b297-1ed6b6060cd9</vct:TransactionID>
    <vct:StatusCode>100</vct:StatusCode>
    <vct:IsTest>false</vct:IsTest>
    <StartIndex>0</StartIndex>
    <Count>2</Count>
    <TotalCount>2</TotalCount>
    <ResultFormat>ITEM_DETAIL</ResultFormat>
    <vco:ItemDetail>
        <cac:Item>
            <cbc:Description>
            QUICK BRICK REIFEN 26X2.125 BLACK Felt Cruiserreifen Quickbrick - Cruiserreifen mit Style und schönem Design - Größe: 26 Zoll - Breite: 2.125 Zoll - für vorne und hinten - Farbe: schwarz
            </cbc:Description>
            <cac:SellersItemIdentification>
                <cac:ID>H8450</cac:ID>
            </cac:SellersItemIdentification>
            <cac:BasePrice>
                <cbc:PriceAmount amountCurrencyID="CHF">15.00</cbc:PriceAmount>
                <cbc:BaseQuantity quantityUnitCode="EA">1</cbc:BaseQuantity>
            </cac:BasePrice>
            <cac:RecommendedRetailPrice>
                <cbc:PriceAmount amountCurrencyID="CHF">26.85</cbc:PriceAmount>
                <cbc:BaseQuantity quantityUnitCode="EA">1</cbc:BaseQuantity>
            </cac:RecommendedRetailPrice>
            <ItemInformation>
                <InformationURL>
                    <URI>
                    https://secure.abacuscity.ch/abavimage/H8450.jpg?s=168&i=h2nJnWTWBkrB7UNSPt7i&vtid=195&vrid=1413&vfn=H8450.jpg
                    </URI>
                    <Disposition>picture</Disposition>
                </InformationURL>
            </ItemInformation>
        </cac:Item>
        <vco:Availability>
            <vco:Code>available</vco:Code>
        </vco:Availability>
    </vco:ItemDetail>
</SearchResultResponse>
EOT;

// Notwendiger Hack, da das Beispiel-XML-Dokument syntaktisch fehlerhaft ist.
// Die "&"-Vorkommen aus dem "URI"-Element müssen in XML als "&amp;" kodiert
// werden oder es muss alternativ ein "<![CDATA[...]]>"-Bereich eingefügt
// werden. Bei Generierung ändern oder bei den Leuten beschweren, die es
// generieren
$data = str_replace('&', '&amp;', $data);

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadXML($data);

// Variante via XPath
$f = function (DOMDocument $doc) {
    $xpath = new DOMXPath($doc);

    // Die Präfix-Aliase sind frei wählbar und können von den Präfixen im
    // XML-Dokument verschieden sein (müssen aber nicht, ist egal). Ich habe
    // hier bewusst nicht "default" (oder so, für den Default-Namespace), "vco"
    // und "cac" gewählt, um das zu verdeutlichen. Entscheidend ist immer der
    // Namespace-URI. Über den läuft die Zuordnung letztlich
    $xpath->registerNamespace('x', 'urn:veloconnect:catalog-1.1');
    $xpath->registerNamespace('a', 'urn:veloconnect:order-1.1');
    $xpath->registerNamespace('b', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0');

    $uri = $xpath->query(
        '/x:SearchResultResponse/a:ItemDetail/b:Item/x:ItemInformation/x:InformationURL/x:URI'
    )->item(0);

    return trim($uri->nodeValue);
};

// Variante "zu Fuß"
$g = function (DOMDocument $doc) {
    $root            = $doc->documentElement;
    $itemDetail      = $root           ->getElementsByTagNameNS('urn:veloconnect:order-1.1'  , 'ItemDetail'     )->item(0);
    $item            = $itemDetail     ->getElementsByTagNameNS('urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0', 'Item')->item(0);
    $itemInformation = $item           ->getElementsByTagNameNS('urn:veloconnect:catalog-1.1', 'ItemInformation')->item(0);
    $informationUrl  = $itemInformation->getElementsByTagNameNS('urn:veloconnect:catalog-1.1', 'InformationURL' )->item(0);
    $uri             = $informationUrl ->getElementsByTagNameNS('urn:veloconnect:catalog-1.1', 'URI'            )->item(0);

    return trim($uri->nodeValue);
};

var_dump(
    $f($doc),
    $g($doc)
);
```


----------



## Spelmann (5. Mai 2015)

Ich danke euch nochmal für euer großartiges Engagement!
Die Tage habe ich noch andere Sachen um die Ohren, aber am Wochenende setze ich mich wieder ran.
Vielen Dank.


----------



## Spelmann (31. Mai 2015)

Ich hätte nie gedacht dass das so schwierig ist.

Mithilfe von sheel in einem anderem Thread konnte ich endlich die realen Daten zumindest mal abrufen.
Ich bin aber noch immer weit davon entfernt die obigen Beispiele umsetzen zu können.

Weiter als bis zu dieser Fehlermeldung komme ich nicht:
entweder (simpleXML):
*Warning*: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in
oder (DOM):
*Warning*: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1

Vielleicht beschreibe ich nochmal die derzeitige Ausgangslage:
Die XML Daten werden über eine ReST Schnittstelle bereitgestellt. Um diese Daten zu bekommen, muss man Authentifizierungsdaten im Header mitsenden. Das funktioniert inzwischen:

```
<?php
    $cu = curl_init("https://services.mobile.de/search-api/search?customerNumber=******&page.size=2");
        curl_setopt($cu, CURLOPT_HEADER, 0);
        curl_setopt($cu, CURLOPT_HTTPHEADER, array(
            'Accept: application/xml',
            'Authorization: Basic' . base64_encode("********:********"),
            'Accept-Language: de'
            ));
        $cudata = curl_exec($cu);
        curl_close($cu);
        ?>
```

$cudata = curl_exec($cu); gibt im Quelltext wenn ich die Daten für zwei Fahrzeuge abrufe folgendes aus:

```
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
            <title>MOBILE.de Test</title>
    </head>
<body>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><search:search-result xmlns:seller="http://services.mobile.de/schema/seller" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:resource="http://services.mobile.de/schema/resource" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
            <search:total>48</search:total>
            <search:page-size>2</search:page-size>
            <search:current-page>1</search:current-page>
            <search:max-pages>25</search:max-pages>
            <search:ads>
                <ad:ad key="194142776" url="https://services.mobile.de/search-api/ad/194142776">
                    <ad:creation-date value="2014-05-14T12:54:24+02:00"/>
                    <ad:modification-date value="2015-03-14T13:17:18+01:00"/>
                    <ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-golf-vi-1-4-tsi-comfortline-beverstedt-ot-lunestedt/194142776.html"/>
                    <ad:vehicle>
                        <ad:class key="Car" url="https://services.mobile.de/refdata/classes/Car">
                            <resource:local-description xml-lang="de">Pkw</resource:local-description>
                        </ad:class>
                        <ad:category key="Limousine" url="https://services.mobile.de/refdata/categories/Limousine">
                            <resource:local-description xml-lang="de">Limousine</resource:local-description>
                        </ad:category>
                        <ad:make key="VW" url="https://services.mobile.de/refdata/classes/Car/makes/VW">
                            <resource:local-description xml-lang="de">Volkswagen</resource:local-description>
                        </ad:make>
                        <ad:model key="Golf" url="https://services.mobile.de/refdata/classes/Car/makes/VW/models/Golf">
                            <resource:local-description xml-lang="de">Golf</resource:local-description>
                        </ad:model>
                        <ad:model-description value="Golf VI 1.4 TSI Comfortline"/>
                        <ad:accident-damaged value="false"/>
                        <ad:roadworthy value="true"/>
                        <ad:features url="https://services.mobile.de/refdata/features">
                            <ad:feature key="METALLIC" url="https://services.mobile.de/refdata/features/METALLIC">
                                <resource:local-description xml-lang="de">Metallic</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ALLOY_WHEELS" url="https://services.mobile.de/refdata/features/ALLOY_WHEELS">
                                <resource:local-description xml-lang="de">Leichtmetallfelgen</resource:local-description>
                            </ad:feature>
                            <ad:feature key="CENTRAL_LOCKING" url="https://services.mobile.de/refdata/features/CENTRAL_LOCKING">
                                <resource:local-description xml-lang="de">Zentralverriegelung</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ELECTRIC_WINDOWS" url="https://services.mobile.de/refdata/features/ELECTRIC_WINDOWS">
                                <resource:local-description xml-lang="de">Elektr. Fensterheber</resource:local-description>
                            </ad:feature>
                            <ad:feature key="IMMOBILIZER" url="https://services.mobile.de/refdata/features/IMMOBILIZER">
                                <resource:local-description xml-lang="de">Elektr. Wegfahrsperre</resource:local-description>
                            </ad:feature>
                            <ad:feature key="POWER_ASSISTED_STEERING" url="https://services.mobile.de/refdata/features/POWER_ASSISTED_STEERING">
                                <resource:local-description xml-lang="de">Servolenkung</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ABS" url="https://services.mobile.de/refdata/features/ABS">
                                <resource:local-description xml-lang="de">ABS</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ESP" url="https://services.mobile.de/refdata/features/ESP">
                                <resource:local-description xml-lang="de">ESP</resource:local-description>
                            </ad:feature>
                            <ad:feature key="FULL_SERVICE_HISTORY" url="https://services.mobile.de/refdata/features/FULL_SERVICE_HISTORY">
                                <resource:local-description xml-lang="de">Scheckheftgepflegt</resource:local-description>
                            </ad:feature>
                            <ad:feature key="E10_ENABLED" url="https://services.mobile.de/refdata/features/E10_ENABLED">
                                <resource:local-description xml-lang="de">E10-geeignet</resource:local-description>
                            </ad:feature>
                            <ad:feature key="HU_AU_NEU" url="https://services.mobile.de/refdata/features/HU_AU_NEU">
                                <resource:local-description xml-lang="de">HU neu</resource:local-description>
                            </ad:feature>
                            <ad:feature key="WARRANTY" url="https://services.mobile.de/refdata/features/WARRANTY">
                                <resource:local-description xml-lang="de">Garantie</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ELECTRIC_EXTERIOR_MIRRORS" url="https://services.mobile.de/refdata/features/ELECTRIC_EXTERIOR_MIRRORS">
                                <resource:local-description xml-lang="de">Elektr. Seitenspiegel</resource:local-description>
                            </ad:feature>
                            <ad:feature key="TUNER" url="https://services.mobile.de/refdata/features/TUNER">
                                <resource:local-description xml-lang="de">Tuner/Radio</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ISOFIX" url="https://services.mobile.de/refdata/features/ISOFIX">
                                <resource:local-description xml-lang="de">Isofix (Kindersitzbefestigung)</resource:local-description>
                            </ad:feature>
                            <ad:feature key="BENDING_LIGHTS" url="https://services.mobile.de/refdata/features/BENDING_LIGHTS">
                                <resource:local-description xml-lang="de">Kurvenlicht</resource:local-description>
                            </ad:feature>
                            <ad:feature key="FRONT_FOG_LIGHTS" url="https://services.mobile.de/refdata/features/FRONT_FOG_LIGHTS">
                                <resource:local-description xml-lang="de">Nebelscheinwerfer</resource:local-description>
                            </ad:feature>
                            <ad:feature key="DAYTIME_RUNNING_LIGHTS" url="https://services.mobile.de/refdata/features/DAYTIME_RUNNING_LIGHTS">
                                <resource:local-description xml-lang="de">Tagfahrlicht</resource:local-description>
                            </ad:feature>
                            <ad:feature key="NONSMOKER_VEHICLE" url="https://services.mobile.de/refdata/features/NONSMOKER_VEHICLE">
                                <resource:local-description xml-lang="de">Nichtraucher-Fahrzeug</resource:local-description>
                            </ad:feature>
                            <ad:feature key="PARKING_SENSORS" url="https://services.mobile.de/refdata/features/PARKING_SENSORS">
                                <resource:local-description xml-lang="de">Einparkhilfe</resource:local-description>
                            </ad:feature>
                        </ad:features>
                        <ad:specifics>
                            <ad:exterior-color key="BLUE" url="https://services.mobile.de/refdata/colors/BLUE">
                                <resource:local-description xml-lang="de">Blau</resource:local-description>
                                <ad:metalic value="true"/>
                                <ad:manufacturer-color-name value="Shark Blue Metallic"/>
                            </ad:exterior-color>
                            <ad:mileage value="19300"/>
                            <ad:first-registration value="2009-12"/>
                            <ad:emission-class key="EURO5" url="https://services.mobile.de/refdata/emissionclasses/EURO5">
                                <resource:local-description xml-lang="de">Euro5</resource:local-description>
                            </ad:emission-class>
                            <ad:emission-fuel-consumption envkv-compliant="false" co2-emission="144.00" inner="8.20" outer="5.10" combined="6.20" unit="LITER_PER_100_KM"/>
                            <ad:fuel key="PETROL" url="https://services.mobile.de/refdata/fuels/PETROL">
                                <resource:local-description xml-lang="de">Benzin</resource:local-description>
                            </ad:fuel>
                            <ad:power value="90"/>
                            <ad:gearbox key="MANUAL_GEAR" url="https://services.mobile.de/refdata/gearboxes/MANUAL_GEAR">
                                <resource:local-description xml-lang="de">Schaltgetriebe</resource:local-description>
                            </ad:gearbox>
                            <ad:climatisation key="AUTOMATIC_CLIMATISATION" url="https://services.mobile.de/refdata/climatisations/AUTOMATIC_CLIMATISATION">
                                <resource:local-description xml-lang="de">Klimaautomatik</resource:local-description>
                            </ad:climatisation>
                            <ad:cubic-capacity value="1390"/>
                            <ad:condition key="USED" url="https://services.mobile.de/refdata/conditions/USED">
                                <resource:local-description xml-lang="de">Gebrauchtfahrzeug</resource:local-description>
                            </ad:condition>
                            <ad:number-of-previous-owners>1</ad:number-of-previous-owners>
                        </ad:specifics>
                    </ad:vehicle>
                    <ad:description></ad:description>
                    <ad:images count="1" gallery-url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_23.JPG" url="https://services.mobile.de/search-api/ad/194142776/images">
                        <ad:image>
                            <ad:representation size="S" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_18.JPG"/>
                            <ad:representation size="XL" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_27.JPG"/>
                            <ad:representation size="ICON" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_23.JPG"/>
                            <ad:representation size="L" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_1.JPG"/>
                            <ad:representation size="M" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/4aEAAOxywFhTc0wt/$_24.JPG"/>
                        </ad:image>
                    </ad:images>
                    <ad:price currency="EUR" type="FIXED">
                        <ad:consumer-price-amount value="13890.00"/>
                        <ad:vatable value="false"/>
                    </ad:price>
                    <seller:seller key="453228" url="https://services.mobile.de/search-api/seller/453228">
                        <seller:type value="DEALER" commercial="true"/>
                        <seller:address>
                            <seller:zipcode value="27616"/>
                            <seller:city value="Beverstedt / OT Lunestedt"/>
                            <seller:country-code value="DE"/>
                        </seller:address>
                        <seller:coordinates>
                            <seller:latitude>53.440041</seller:latitude>
                            <seller:longitude>8.734520</seller:longitude>
                        </seller:coordinates>
                    </seller:seller>
                </ad:ad>
                <ad:ad key="194157596" url="https://services.mobile.de/search-api/ad/194157596">
                    <ad:creation-date value="2014-05-14T17:28:54+02:00"/>
                    <ad:modification-date value="2014-10-27T08:58:30+01:00"/>
                    <ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-jetta-1-2-tsi-match-navigation-rns-315-beverstedt-ot-lunestedt/194157596.html"/>
                    <ad:vehicle>
                        <ad:class key="Car" url="https://services.mobile.de/refdata/classes/Car">
                            <resource:local-description xml-lang="de">Pkw</resource:local-description>
                        </ad:class>
                        <ad:category key="Limousine" url="https://services.mobile.de/refdata/categories/Limousine">
                            <resource:local-description xml-lang="de">Limousine</resource:local-description>
                        </ad:category>
                        <ad:make key="VW" url="https://services.mobile.de/refdata/classes/Car/makes/VW">
                            <resource:local-description xml-lang="de">Volkswagen</resource:local-description>
                        </ad:make>
                        <ad:model key="Jetta" url="https://services.mobile.de/refdata/classes/Car/makes/VW/models/Jetta">
                            <resource:local-description xml-lang="de">Jetta</resource:local-description>
                        </ad:model>
                        <ad:model-description value="Jetta 1.2 TSI Match NAVIGATION RNS 315"/>
                        <ad:accident-damaged value="false"/>
                        <ad:features url="https://services.mobile.de/refdata/features">
                            <ad:feature key="METALLIC" url="https://services.mobile.de/refdata/features/METALLIC">
                                <resource:local-description xml-lang="de">Metallic</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ALLOY_WHEELS" url="https://services.mobile.de/refdata/features/ALLOY_WHEELS">
                                <resource:local-description xml-lang="de">Leichtmetallfelgen</resource:local-description>
                            </ad:feature>
                            <ad:feature key="CENTRAL_LOCKING" url="https://services.mobile.de/refdata/features/CENTRAL_LOCKING">
                                <resource:local-description xml-lang="de">Zentralverriegelung</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ELECTRIC_WINDOWS" url="https://services.mobile.de/refdata/features/ELECTRIC_WINDOWS">
                                <resource:local-description xml-lang="de">Elektr. Fensterheber</resource:local-description>
                            </ad:feature>
                            <ad:feature key="IMMOBILIZER" url="https://services.mobile.de/refdata/features/IMMOBILIZER">
                                <resource:local-description xml-lang="de">Elektr. Wegfahrsperre</resource:local-description>
                            </ad:feature>
                            <ad:feature key="POWER_ASSISTED_STEERING" url="https://services.mobile.de/refdata/features/POWER_ASSISTED_STEERING">
                                <resource:local-description xml-lang="de">Servolenkung</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ABS" url="https://services.mobile.de/refdata/features/ABS">
                                <resource:local-description xml-lang="de">ABS</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ESP" url="https://services.mobile.de/refdata/features/ESP">
                                <resource:local-description xml-lang="de">ESP</resource:local-description>
                            </ad:feature>
                            <ad:feature key="NAVIGATION_SYSTEM" url="https://services.mobile.de/refdata/features/NAVIGATION_SYSTEM">
                                <resource:local-description xml-lang="de">Navigationssystem</resource:local-description>
                            </ad:feature>
                            <ad:feature key="FULL_SERVICE_HISTORY" url="https://services.mobile.de/refdata/features/FULL_SERVICE_HISTORY">
                                <resource:local-description xml-lang="de">Scheckheftgepflegt</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ELECTRIC_HEATED_SEATS" url="https://services.mobile.de/refdata/features/ELECTRIC_HEATED_SEATS">
                                <resource:local-description xml-lang="de">Sitzheizung</resource:local-description>
                            </ad:feature>
                            <ad:feature key="E10_ENABLED" url="https://services.mobile.de/refdata/features/E10_ENABLED">
                                <resource:local-description xml-lang="de">E10-geeignet</resource:local-description>
                            </ad:feature>
                            <ad:feature key="HU_AU_NEU" url="https://services.mobile.de/refdata/features/HU_AU_NEU">
                                <resource:local-description xml-lang="de">HU neu</resource:local-description>
                            </ad:feature>
                            <ad:feature key="WARRANTY" url="https://services.mobile.de/refdata/features/WARRANTY">
                                <resource:local-description xml-lang="de">Garantie</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ELECTRIC_EXTERIOR_MIRRORS" url="https://services.mobile.de/refdata/features/ELECTRIC_EXTERIOR_MIRRORS">
                                <resource:local-description xml-lang="de">Elektr. Seitenspiegel</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ON_BOARD_COMPUTER" url="https://services.mobile.de/refdata/features/ON_BOARD_COMPUTER">
                                <resource:local-description xml-lang="de">Bordcomputer</resource:local-description>
                            </ad:feature>
                            <ad:feature key="CD_PLAYER" url="https://services.mobile.de/refdata/features/CD_PLAYER">
                                <resource:local-description xml-lang="de">CD-Spieler</resource:local-description>
                            </ad:feature>
                            <ad:feature key="MP3_INTERFACE" url="https://services.mobile.de/refdata/features/MP3_INTERFACE">
                                <resource:local-description xml-lang="de">MP3-Schnittstelle</resource:local-description>
                            </ad:feature>
                            <ad:feature key="MULTIFUNCTIONAL_WHEEL" url="https://services.mobile.de/refdata/features/MULTIFUNCTIONAL_WHEEL">
                                <resource:local-description xml-lang="de">Multifunktionslenkrad</resource:local-description>
                            </ad:feature>
                            <ad:feature key="TUNER" url="https://services.mobile.de/refdata/features/TUNER">
                                <resource:local-description xml-lang="de">Tuner/Radio</resource:local-description>
                            </ad:feature>
                            <ad:feature key="ISOFIX" url="https://services.mobile.de/refdata/features/ISOFIX">
                                <resource:local-description xml-lang="de">Isofix (Kindersitzbefestigung)</resource:local-description>
                            </ad:feature>
                            <ad:feature key="FRONT_FOG_LIGHTS" url="https://services.mobile.de/refdata/features/FRONT_FOG_LIGHTS">
                                <resource:local-description xml-lang="de">Nebelscheinwerfer</resource:local-description>
                            </ad:feature>
                            <ad:feature key="DAYTIME_RUNNING_LIGHTS" url="https://services.mobile.de/refdata/features/DAYTIME_RUNNING_LIGHTS">
                                <resource:local-description xml-lang="de">Tagfahrlicht</resource:local-description>
                            </ad:feature>
                            <ad:feature key="NONSMOKER_VEHICLE" url="https://services.mobile.de/refdata/features/NONSMOKER_VEHICLE">
                                <resource:local-description xml-lang="de">Nichtraucher-Fahrzeug</resource:local-description>
                            </ad:feature>
                            <ad:feature key="PARKING_SENSORS" url="https://services.mobile.de/refdata/features/PARKING_SENSORS">
                                <resource:local-description xml-lang="de">Einparkhilfe</resource:local-description>
                            </ad:feature>
                        </ad:features>
                        <ad:specifics>
                            <ad:exterior-color key="GREY" url="https://services.mobile.de/refdata/colors/GREY">
                                <resource:local-description xml-lang="de">Grau</resource:local-description>
                                <ad:metalic value="true"/>
                                <ad:manufacturer-color-name value="Platinum Grey Metallic"/>
                            </ad:exterior-color>
                            <ad:mileage value="16930"/>
                            <ad:first-registration value="2012-08"/>
                            <ad:emission-class key="EURO5" url="https://services.mobile.de/refdata/emissionclasses/EURO5">
                                <resource:local-description xml-lang="de">Euro5</resource:local-description>
                            </ad:emission-class>
                            <ad:emission-fuel-consumption envkv-compliant="false" co2-emission="134.00" inner="7.10" outer="4.90" combined="5.70" unit="LITER_PER_100_KM"/>
                            <ad:fuel key="PETROL" url="https://services.mobile.de/refdata/fuels/PETROL">
                                <resource:local-description xml-lang="de">Benzin</resource:local-description>
                            </ad:fuel>
                            <ad:power value="77"/>
                            <ad:gearbox key="MANUAL_GEAR" url="https://services.mobile.de/refdata/gearboxes/MANUAL_GEAR">
                                <resource:local-description xml-lang="de">Schaltgetriebe</resource:local-description>
                            </ad:gearbox>
                            <ad:climatisation key="AUTOMATIC_CLIMATISATION" url="https://services.mobile.de/refdata/climatisations/AUTOMATIC_CLIMATISATION">
                                <resource:local-description xml-lang="de">Klimaautomatik</resource:local-description>
                            </ad:climatisation>
                            <ad:cubic-capacity value="1197"/>
                            <ad:condition key="USED" url="https://services.mobile.de/refdata/conditions/USED">
                                <resource:local-description xml-lang="de">Gebrauchtfahrzeug</resource:local-description>
                            </ad:condition>
                            <ad:number-of-previous-owners>1</ad:number-of-previous-owners>
                        </ad:specifics>
                    </ad:vehicle>
                    <ad:description></ad:description>
                    <ad:images count="1" gallery-url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_23.JPG" url="https://services.mobile.de/search-api/ad/194157596/images">
                        <ad:image>
                            <ad:representation size="S" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_18.JPG"/>
                            <ad:representation size="XL" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_27.JPG"/>
                            <ad:representation size="ICON" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_23.JPG"/>
                            <ad:representation size="L" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_1.JPG"/>
                            <ad:representation size="M" url="http://i.ebayimg.com/00/s/NDgwWDY0MA==/z/5dYAAOxyZzlTc4xP/$_24.JPG"/>
                        </ad:image>
                    </ad:images>
                    <ad:price currency="EUR" type="FIXED">
                        <ad:consumer-price-amount value="16950.00"/>
                        <ad:vatable value="true"/>
                        <ad:vat-rate value="0.1900"/>
                    </ad:price>
                    <seller:seller key="453228" url="https://services.mobile.de/search-api/seller/453228">
                        <seller:type value="DEALER" commercial="true"/>
                        <seller:address>
                            <seller:zipcode value="27616"/>
                            <seller:city value="Beverstedt / OT Lunestedt"/>
                            <seller:country-code value="DE"/>
                        </seller:address>
                        <seller:coordinates>
                            <seller:latitude>53.440041</seller:latitude>
                            <seller:longitude>8.734520</seller:longitude>
                        </seller:coordinates>
                    </seller:seller>
                </ad:ad>
            </search:ads>
        </search:search-result>       
        <h1>Ausgabe</h1>
               
    </body>
</html>
```

Wenn ihr mich weiter so engagiert unterstützen würdet und mir auf Basis dieser Daten zeigen könntet wie ich für beide Fahrzeuge z.B. Fahrzeugmodell, Felgentyp und Schaltung ausgeben könnte wär das super. Ich komm echt nicht mehr weiter.

Vielen, vielen Dank.


----------



## sheel (31. Mai 2015)

Hi

kannst du auch den Code mit den Simplexml-Funktionen zeigen, der die Fehler erzeugt?


----------



## Spelmann (31. Mai 2015)

Mir schien das hier logisch:

```
$xml = simplexml_load_string($cudata);
```


----------



## sheel (31. Mai 2015)

Da könnte ein BOM sein.
Was gibt folgender Code aus:

```
for ($i = 0; $i < 10; $i++) {
    echo dechex(ord($cudata[$i]));
}
```


----------



## Spelmann (31. Mai 2015)

zehn mal 0


----------



## saftmeister (31. Mai 2015)

Könnte aber auch daran liegen, dass das XML im Body eines HTML-Dokuments eingebettet ist. Es wäre wohl einen Versuch wert, den Body mittels Regex oder bspw. auch substr() zu extrahieren.


----------



## Spelmann (31. Mai 2015)

Das ist doch nur das HTML Gerüst des Dokumentes, in dem ich die XML Daten aus der Schnittstelle verarbeite?.


----------



## sheel (31. Mai 2015)

Zehn Nuller sollten da aber eigentlich nicht sein 
Bin grad etwas ratlos, wie das gehen soll, wenn die selbe Variable ausgegeben das oben Gezeigte erzeugt.


----------



## saftmeister (31. Mai 2015)

Passiert das auch, wenn du 


```
curl_setopt($cu, CURLOPT_RETURNTRANSFER, TRUE);
```

ausführst, bevor curl_exec() ausgeführt wird?


----------



## Spelmann (31. Mai 2015)

Nee, dann ergibt die Schleife:

3c
3f
78
6d
6c
20
76
65
72
73


Was kann man denn daraus erkennen?


----------



## Spelmann (31. Mai 2015)

Nachtrag:
Fahrzeugdaten sind, wenn ich 
	
	
	



```
curl_setopt($cu, CURLOPT_RETURNTRANSFER, TRUE);
```
 einsetze aber nicht mehr verfügbar.


----------



## saftmeister (31. Mai 2015)

Die RETURNTRANSFER-Option teilt curl mit, dass der Content, welcher beim Ausführen mittels curl_exec() zurück kommt, nicht direkt an den Browser geschickt sondern einer Variable zugewiesen werden soll. Daher siehst du die Rückgabe zunächst nicht mehr. Das ändert sich, wenn du $cudata mittels echo ausgibst. Standardmäßig ist diese Option auf false, daher wird alles an den Browser geschickt und landet nicht in der Variable. Die bekommt den Rückgabewert der Funktion als boolscher Wert zurück und der ist halt kein String. Steht aber alles im Manual zu den curl-Funktionen ;-)


----------



## Spelmann (25. Juni 2015)

Ich bin nun ein kleines Stück weiter.
Meine Schleife gibt mir schon mal die Modelle aus:

```
for($i=0; $i<$anzahlItems; $i++){
     
        echo "<hr>";
        $path = "/my_search:search-result/my_search:ads/my_ad:ad/my_ad:vehicle/my_ad:model";
        $res = $xml->xpath($path);
        echo $res[$i]->children($namespaces['my_resource'])->{'local-description'}."<br>" ;
 
    }
```
Jetzt sind aber in der XML bestimmte Werte nicht als Kindelement eines Knotens sondern als Parameter? Key? innerhalb des Knotens deklariert.

```
<ad:detail-page url="http://suchen.mobile.de/auto-inserat/vw-golf-vi-1-4-*****.html"/>
```
Die URL bekomme ich noch nicht angesprochen. Könnt ihr mir weiterhelfen?

Vielen Dank


----------



## Spelmann (25. Juni 2015)

OK, ich habs:

```
$path = "/my_search:search-result/my_search:ads/my_ad:ad";
        $res = $xml->xpath($path);
        $attrs = $res[$i]->children($namespaces['my_ad'])->{'detail-page'}->attributes();
```


----------



## Spelmann (26. Juni 2015)

Nächstes Problem. So langsam verlier ich die Lust 

Mir gelingt es nun, den Inhalt der Knoten in ein Array zu schreiben. Egal ob der gewünschte Wert zwischen den Tags des Knotens oder als Schlüsselwert im Tag selbst deklariert ist:

```
//Fahrzeug Modell-Detail
        $pathModellDetail = "/mySEARCH:search-result/mySEARCH:ads/myAD:ad/myAD:vehicle";
        $resModellDetail = $xml->xpath($pathModellDetail);
        $attrModellDetail = $resModellDetail[$i]->children($namespaces['myAD'])->{'model-description'}->attributes();
        $carAllItems[$i]['fzModellDetail'] = $attrModellDetail['value'];
    
        //Fahrzeug Unfaller
        $pathUnfaller = "/mySEARCH:search-result/mySEARCH:ads/myAD:ad/myAD:vehicle";
        $resUnfaller = $xml->xpath($pathUnfaller);
        $attr02 = $resUnfaller[$i]->children($namespaces['myAD'])->{'accident-damaged'}->attributes();
        $carAllItems[$i]['fzUnfaller'] = $attr02;
```

Ist sicher nicht kompakt, geschweige denn elegant, aber so komme ich erstmal zurecht. Jetzt gefällt sich mobile.de aber darin, nicht für jeden Datensatz die gleiche Anzahl von Knoten zu generieren.  So ist der Knoten für die Verkehrssicherheit des Fahrzeugs, anders als der Knoten im obigen Beispiel

```
//Unfaller
<ad:accident-damaged value="false"/>
```


```
//Fahrtüchtig
<ad:roadworthy value="true"/>
```
nicht etwa auf false gesetzt wenn das Fahrzeug nicht fahrtüchtig ist, sondern schlichtweg nicht vorhanden.
Das erzeugt natürlich in meiner Schleife, in der ich mein Array mit den Werten der Knoten fülle eine Warnung wenn ich auf einen Datensatz treffe, für den der Knoten nicht existiert:

```
Warning: SimpleXMLElement::__toString(): Node no longer exists in...
```
Ich habe versucht zu prüfen ob der Pfad existiert und den Wert entsprechend zuzuordnen, aber das wirkt nicht:

```
if($resVerkehrssicher[$i]->children($namespaces['myAD'])->{'roadworthy'}->attributes() != null){
            $attr03 = $resVerkehrssicher[$i]->children($namespaces['myAD'])->{'roadworthy'}->attributes();
            $carAllItems[$i]['fzVerkehrssicher'] = $attr03;
            }else{
            $carAllItems[$i]['fzVerkehrssicher'] = "nk";        
        }
```

Kann mir jemand weiterhelfen?


----------



## saftmeister (29. Juni 2015)

Hi,

also auf Attribute von Elementen kann man mit @attributname zugreifen. Poste doch noch mal das Ausgangs-XML und das Attribute, was du haben willst, dann kann man einen XPath-Ausdruck zusammen bauen. Der liefert dann entweder das passende Attribut-Ergebnis oder FALSE: http://php.net/manual/de/simplexmlelement.xpath.php


----------



## placedog (28. Mai 2018)

gab es hier noch eine Lösung ?


----------



## Spelmann (31. Mai 2018)

Hallo placedog,
ich komme leider gerade nicht an das Script das ich damals bearbeitet habe. Im Moment funktioniert die Schnittstelle auch nicht. Woran das liegt weiß ich nicht, da ich es zwischendurch nicht angefasst habe. Ob der Kunde neue Zugangsdaten hat oder mobile.de was geändert hat ist unklar. Kann aber sein dass ich da selbst nochmal ran muss in der nächsten Zeit. Mehr kann ich leider nicht sagen. Das Projekt hatte mich seinerzeit an meine Grenzen gebracht.


----------

