none
XDocument einlesen von Datei oder URL mit Schema RRS feed

  • Frage

  • Hi,

    ich habe eine XML Datei, welche ich gern als XDocument einlesen möchte. Dazu nutze ich

    XDocument immoDoc = XDocument.Load("NestoriaXML.txt");

    Leider erhalte ich folgende Fehlermeldung beim einlesen: System.Xml.XmlException: "Unerwartetes Token '='. Erwartet wurde das Token ';'. Zeile 5, Position 410."

    Hier ein Auszug der XML:

    <opt xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://api.nestoria.co.uk/xml-schema-1.22.xsd">
    <request country="de" language="de" location="coord_50.88796587158805,10.938894039453755,51.06762892841195,11.118578760546244" num_res="50" offset="100" output="xml" page="3" pretty="1" product_type="realestate" property_type="property" size_type="gross" size_unit="m2" sort="nestoria_rank" listing_type="appartmentbuy"/>
    <response application_response_code="100" application_response_text="listings returned for one unambiguous location" created_http="Tue, 16 Jul 2019 15:37:51 GMT" created_unix="1563291471" link_to_url="https://www.nestoria.de/immobilien/kaufen/coord_50.88796587158805,10.938894039453755,51.06762892841195,11.118578760546244/3" page="3" sort="nestoria_rank" status_code="200" status_text="OK" thanks="For using the Nestoria API." total_pages="6" total_results="282" listing_type="appartmentbuy">
    <attribution img_height="22" img_url="https://resources.nestimg.com/nestoria/img/pbr_v1.png" img_width="183" link_to_img="http://www.nestoria.com"/>
    <listings bedroom_number="2" car_spaces="0" commission="0.0" construction_year="0" datasource_name="Immowelt" floor="-1" img_height="300" img_url="https://imgs.nestimg.com/schoner_wohnen_in_erfurt_ringelberg_110128458789701680.jpg" img_width="400" keywords="Keller, Stellplatz, Mehrfamilienhaus" latitude="50.999787" lister_url="https://www.nestoria.de/detail/0000000110128458789701680/title/5/3-1?serpUid=&pt=1&ot=1&l=bruehlervorstadt&did=13_default&t_sec=9&t_or=45&t_pvid=null&utm_source=api&utm_medium=external" listing_type="buy" location_accuracy="6" longitude="11.059815" price="130000.0" price_currency="€" price_formatted="130.000 €" price_high="130000.0" price_low="130000.0" price_type="fixed" property_type="property" room_number="2.0" size="57" size_type="gross" summary="Lage: Das Gebiet Ringelberg ist ein bei den Erfurtern sehr beliebte..." thumb_height="60" thumb_url="https://imgs.nestimg.com/medium/schoner_wohnen_in_erfurt_ringelberg_110128458789701680.jpg" thumb_width="80" title="Erfurt - Mehrfamilienhaus" updated_in_days="287" updated_in_days_formatted="seit mehr als einem Monat"/>
    <listings bathroom_number="2" bedroom_number="7" car_spaces="0" commission="0.0" construction_year="1930" datasource_name="Kommunales Immobilienportal" floor="-1" img_height="300" img_url="https://resources.nestimg.com/nestoria/img/noimage/desktop/flat/3.png" img_width="400" keywords="Keller, Zentralheizung, Einbauküche, Garage, Parkett" latitude="50.946727" lister_name="Sparkasse" lister_url="https://www.nestoria.de/detail/0000000111866288387785851/title/5/3-2?serpUid=&pt=1&ot=1&l=bruehlervorstadt&did=25_default&t_sec=9&t_or=45&t_pvid=null&utm_source=api&utm_medium=external" listing_type="buy" location_accuracy="6" longitude="11.034775" price="640000.0" price_currency="€" price_formatted="640.000 €" price_high="640000.0" price_low="640000.0" price_type="fixed" property_type="flat" room_number="7.0" size="0" size_type="gross" summary="Großzügige Eigentumswohnung in bester Wohnlage im Erfurter Süden:In..." thumb_height="60" thumb_url="https://resources.nestimg.com/nestoria/img/noimage/mobile/flat/4.png" thumb_width="80" title="Wohnung zum Kauf in 99096 Erfurt" updated_in_days="6" updated_in_days_formatted="seit 6 Tagen"/>
    <listings bedroom_number="2" car_spaces="0" commission="0.0" construction_year="0" datasource_name="Immowelt" floor="-1" img_height="300" img_url="https://imgs.nestimg.com/helle_und_freundliche_2_zimmer_eigentumswohnung_in_erfurt_111587669267688641.jpg" img_width="400" keywords="Keller, Stellplatz, Balkon, Einbauküche, Erdgeschoss, Einfamilienhaus" latitude="50.950635" lister_url="https://www.nestoria.de/detail/0000000111587669267688641/title/5/3-3?serpUid=&pt=1&ot=1&l=bruehlervorstadt&did=13_default&t_sec=9&t_or=45&t_pvid=null&utm_source=api&utm_medium=external" listing_type="buy" location_accuracy="7" longitude="11.100749" price="124000.0" price_currency="€" price_formatted="124.000 €" price_high="124000.0" price_low="124000.0" price_type="fixed" property_type="property" room_number="2.0" size="59" size_type="gross" summary="Lage: Die Wohnung befindet sich in Windischholzhausen eine idyllisc..." thumb_height="60" thumb_url="https://imgs.nestimg.com/medium/helle_und_freundliche_2_zimmer_eigentumswohnung_in_erfurt_111587669267688641.jpg" thumb_width="80" title="Erfurt - Balkon, Einfamilienhaus" updated_in_days="51" updated_in_days_formatted="seit mehr als einem Monat"/>

    Die "Suchergebnisse" werden in <listings> aufgelistet.. Die einzelnen Angaben wie Räume werden allerdings nicht als Childs sondern als Parameter angegeben. (Also soweit wie ich das mit meinen kläglichen Kenntnissen beurteilen kann :)

    Mir ist aufgefallen, dass es auch ein gewisses Schema gibt. Darauf wird in der ersten Zeile verwiesen (<opt xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://api.nestoria.co.uk/xml-schema-1.22.xsd">)

    Wie gelingt es mir, diese XML einzulesen, oder gar noch besser, gleich aus dem Web zu ziehen via URL und weiterzuverarbeiten, sodass mir die einzelnen Einträge als Objekt/Objektliste zur Verfügung stehen?

    Vielen Dank schon mal für Eure Hilfe.


    .::datekk::.


    • Bearbeitet datekk2 Dienstag, 16. Juli 2019 16:19
    Dienstag, 16. Juli 2019 16:18

Antworten

  • Hi,

    die XML Datei halt eben nicht korrekt aufgebaut bzw. ist der Inhalt nicht XML konform.

    An der angegeben Position steht ein URL mit Parametern. Dort steht dann bspw.:

    /5/3-1?serpUid=&pt=1&...

    Das ist nicht zulässig. & im Inhalt muss als &amp; hinterlegt werden.

    /5/3-1?serpUid=&amp;pt=1&amp;...

    Ändere das überall, dann klappt das auch.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 16. Juli 2019 16:34
    Moderator
  • Hallo

    >Also die XML Datei baue ich ja nicht selbst, sondern sie wird ja vom Websiteanbieter so ausgeliefert.

    Genau das stimmt nicht, denn der Beispiellink liefert ein valides XML Dokument zurück, es wird also nicht "so ausgeliefert". Ich vermute das Speichern in der Textdatei führt zu dem Problem (&amp; geht dabei verloren?).


    - Gruß Florian


    Mittwoch, 17. Juli 2019 14:06
  • Also die XML Datei baue ich ja nicht selbst, sondern sie wird ja vom Websiteanbieter so ausgeliefert. Ich habe die Ausgabe als Textdatei abgespeichert

    Du hast dir den Inhalt der Datei wahrscheinlich in Firefox oder einem anderen Browser angeschaut, dort alles markiert, kopiert und in eine Textdatei geschrieben. Das geht natürlich nicht, da die Darstellung eine ganz andere ist als der eigentliche Inhalt.

    Wenn Du das schon machen willst, geh über "Datei -> Speichern unter..." oder nimm gleich WebClient.DownloadString( <Url> ) (für .NET Classic, also bis bis .NET Framework 4.8), dann hast Du das Problem gar nicht erst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 17. Juli 2019 14:50
    Moderator
  • Hi,
    ich empfehle Dir beim Seitenanbieter nachzufragen, ob es einen Endpunkt (WebService o.ä.) gibt, wo Du die Daten anders abrufen kannst. Mit der Abfrage beim Anbieter kannst Du auch gleich erkennen, ob der von Dir geplante Weg überhaut rechtens ist.

    Wenn es keine rechtlichen Probleme gibt, kannst Du die Daten auch parsen und XML-konform machen, wie es Stefan vorgeschlagen hat.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Dienstag, 16. Juli 2019 17:40
  • Hi,

    für Json schau dir am besten mal JSON.NET an. Damit kannst Du Json genauso einfach und sicher serialisieren und deserialisieren wie Du es jetzt mit XML machst (wenn der XML Inhalt denn korrekt wäre)

    Ich würde mir hierfür eine entsprechende Klassenstruktur anlegen, die Inhalte bspw. per WebClient.DownloadString (vorausgesetzt, Du erstellst eine .NET Classic Anwendung, bei .NET Core wird das etwas anders gemacht) runterladen und das Ergebnis dann von JSON.NET in ein Objekt deserialisieren.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 16. Juli 2019 21:38
    Moderator

Alle Antworten

  • Hi,

    die XML Datei halt eben nicht korrekt aufgebaut bzw. ist der Inhalt nicht XML konform.

    An der angegeben Position steht ein URL mit Parametern. Dort steht dann bspw.:

    /5/3-1?serpUid=&pt=1&...

    Das ist nicht zulässig. & im Inhalt muss als &amp; hinterlegt werden.

    /5/3-1?serpUid=&amp;pt=1&amp;...

    Ändere das überall, dann klappt das auch.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 16. Juli 2019 16:34
    Moderator
  • Hallo Stefan,

    danke, dass Du immer so schnell einspringst... Klasse :)

    Also die XML Datei baue ich ja nicht selbst, sondern sie wird ja vom Websiteanbieter so ausgeliefert. Ich habe die Ausgabe als Textdatei abgespeichert, später möchte ich diese jedoch direkt aus dem Web abrufen und verarbeiten.

    Hier ein Beispiellink: https://api.nestoria.co.uk/api?encoding=xml&pretty=1&action=search_listings&country=uk&listing_type=buy&place_name=brighton

    Wie kann ich direkt vom Web aus die Dateien an XDokument übergeben und wie kann ich dann vorher darauf Einfluss nehmen und das amp hinter jedes & einbauen?

    LG



    .::datekk::.

    Dienstag, 16. Juli 2019 16:43
  • Hi,
    ich empfehle Dir beim Seitenanbieter nachzufragen, ob es einen Endpunkt (WebService o.ä.) gibt, wo Du die Daten anders abrufen kannst. Mit der Abfrage beim Anbieter kannst Du auch gleich erkennen, ob der von Dir geplante Weg überhaut rechtens ist.

    Wenn es keine rechtlichen Probleme gibt, kannst Du die Daten auch parsen und XML-konform machen, wie es Stefan vorgeschlagen hat.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Dienstag, 16. Juli 2019 17:40
  • Naja, das ist schon rechtens (https://www.nestoria.co.uk/help/api).

    Der Dienst bietet die Datenausgabe auch via JSON an. Damit kann ich es ja auch mal probieren. Im Moment habe ich noch keine Ahnung, wie ich das nutzen kann und zu einem Objekt mache.

    Beispiel: https://api.nestoria.de/api?encoding=json&pretty=1&action=search_listings&country=de&listing_type=buy&place_name=bonn


    .::datekk::.

    Dienstag, 16. Juli 2019 17:54
  • Hi,

    für Json schau dir am besten mal JSON.NET an. Damit kannst Du Json genauso einfach und sicher serialisieren und deserialisieren wie Du es jetzt mit XML machst (wenn der XML Inhalt denn korrekt wäre)

    Ich würde mir hierfür eine entsprechende Klassenstruktur anlegen, die Inhalte bspw. per WebClient.DownloadString (vorausgesetzt, Du erstellst eine .NET Classic Anwendung, bei .NET Core wird das etwas anders gemacht) runterladen und das Ergebnis dann von JSON.NET in ein Objekt deserialisieren.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 16. Juli 2019 21:38
    Moderator
  • Hallo

    >Also die XML Datei baue ich ja nicht selbst, sondern sie wird ja vom Websiteanbieter so ausgeliefert.

    Genau das stimmt nicht, denn der Beispiellink liefert ein valides XML Dokument zurück, es wird also nicht "so ausgeliefert". Ich vermute das Speichern in der Textdatei führt zu dem Problem (&amp; geht dabei verloren?).


    - Gruß Florian


    Mittwoch, 17. Juli 2019 14:06
  • Also die XML Datei baue ich ja nicht selbst, sondern sie wird ja vom Websiteanbieter so ausgeliefert. Ich habe die Ausgabe als Textdatei abgespeichert

    Du hast dir den Inhalt der Datei wahrscheinlich in Firefox oder einem anderen Browser angeschaut, dort alles markiert, kopiert und in eine Textdatei geschrieben. Das geht natürlich nicht, da die Darstellung eine ganz andere ist als der eigentliche Inhalt.

    Wenn Du das schon machen willst, geh über "Datei -> Speichern unter..." oder nimm gleich WebClient.DownloadString( <Url> ) (für .NET Classic, also bis bis .NET Framework 4.8), dann hast Du das Problem gar nicht erst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 17. Juli 2019 14:50
    Moderator
  • Alles klar... das wusste ich nicht... Aller Anfang ist halt schwer :) 

    Ich danke Euch für Eure Antworten. Ich schaue mal, wie weit ich mit meinem Projekt komme und melde mich definitiv bald wieder :)


    .::datekk::.

    Donnerstag, 18. Juli 2019 11:27