Ga naar inhoud
  • 0

Probleem importeren XML via HTTP-verzoek


Meeuwis

Vraag

Goedemorgen,

Kan iemand mij helpen met het volgende probleem.

Ik wil in een bestaand record van de adrestabel het veld 'postcode' bijwerken. De gegevens voor het bijwerken van dit veld haal ik op middels HTTP-request. De URL geeft een XML-bestandje terug, waar ik vervolgens de postcode uit wil halen.

Ik probeer dit te doen met de optie RECORDS IMPORTEREN. Als gegevensbron gebruik ik het onderstaand HTTP-verzoek XSL-sheet. Bij de importeerhandeling geeft ik aan dat hij bestaand record moet bijwerken. Maar als ik het script vervolgens uitvoer, geeft hij lege waarden terug. Het lijkt wel of hij geen rij aanmaakt of dat Filemaker de XML niet goed kan lezen. Wat is er mis met mijn XSL-bestand?

Ik gebruik het volgende HTTP-verzoek:
https://eu1.locationiq.com/v1/search.php?key=ba8932cb95ae2f&q=Slingeplein+1+Rotterdam&format=xml&addressdetails=1&limit=1

Ik krijgt dat (in de browser) het volgende XML bestand terug:

<?xml version="1.0" encoding="UTF-8" ?>
<searchresults timestamp='Tue, 02 Jul 19 12:14:51 +0530' attribution='https://locationiq.com/attribution' querystring='Slingeplein 1 Rotterdam' polygon='false' exclude_place_ids='32119985' more_url='https://locationiq.org/static/search.php?q=Slingeplein+1+Rotterdam&addressdetails=1&exclude_place_ids=32119985&format=xml'>
	<place place_id='32119985' osm_type='node' osm_id='2788805055' place_rank='30' boundingbox="51.8728036,51.8729036,4.4892784,4.4893784" lat='51.8728536' 	lon='4.4893284' display_name='1, Slingeplein, Rotterdam, Zuid-Holland, Nederland, 3085EZ, Nederland' class='place' type='house' importance='0.331'>
		<house_number>1</house_number>
      		<pedestrian>Slingeplein</pedestrian>
      		<suburb>Rotterdam</suburb>
      		<city>Rotterdam</city>
      		<state>Zuid-Holland</state>
      		<postcode>3085EZ</postcode>
      		<country>Nederland</country>
      		<country_code>nl</country_code>
	</place>
</searchresults>

Ik gebruikt de volgende XLST om plaats, postcode en land te selecteren:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
      <METADATA>
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Plaats" TYPE="TEXT"/> 
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Postcode" TYPE="TEXT"/> 
        <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Land" TYPE="TEXT"/> 
      </METADATA>
      <RESULTSET>
        <ROW>
          <COL>
            <DATA><xsl:value-of select="searchresults/place/city"/></DATA>
          </COL>
          <COL>
            <DATA><xsl:value-of select="searchresults/place/postcode"/></DATA>
          </COL>
          <COL>
            <DATA><xsl:value-of select="searchresults/place/country"/></DATA>
          </COL>
        </ROW>
      </RESULTSET>
    </FMPXMLRESULT>
  </xsl:template>
</xsl:stylesheet>

Ps: ik werk met FMP14

Link naar reactie

3 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Er is niks mis met jouw xsl, maar de parser kan niks met het xml-bestand. De inhoud van het attribuut "more_url" bevat ongeldige xml. Er staat:

more_url='https://locationiq.org/static/search.php?q=Slingeplein+1+Rotterdam&addressdetails=1&exclude_place_ids=32119985&format=xml'

Maar daar staan "ampersands" (&) en dat zijn entiteiten die ze moeten encoden en dan ziet het er zo uit:

more_url="https://locationiq.org/static/search.php?q=Slingeplein+1+Rotterdam&amp;addressdetails=1&amp;exclude_place_ids=32119985&amp;format=xml"

m.a.w. de "&" zijn hierin "&amp;" geworden en dan werkt het wél en kan FM de data gewoon importeren. 

Misschien kan je de URL waarmee je de opvraag doet aanpassen en dan dan een correct "more_url" in het resultaatbestand staat.

Link naar reactie
  • 0

Ik zie eerlijk gezegd niet zo snel gebeuren dat locationiq.org de output zal aanpassen. Je kan als alternatief voor Nederlandse adressen de (gratis) webservice van de overheid gebruiken. Je hoeft je niet aan te melden oid en je kan het zo gebruiken. De opvraag voor jouw voorbeeldadres zou dan worden:

"http://geodata.nationaalgeoregister.nl/locatieserver/free?wt=xml&q=" & GetAsURLEncoded ( "Slingeplein and 1 and Rotterdam" )

en door jouw eigen xslt minimaal aan te passen kan je het ook importeren:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Plaats" TYPE="TEXT"/> 
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Postcode" TYPE="TEXT"/> 
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Land" TYPE="TEXT"/> 
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Huisnr_Toevoeging" TYPE="TEXT"/> 
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="/response/result/doc">
                <ROW>
                    <COL>
                        <DATA><xsl:value-of select="str[@name='woonplaatsnaam']"/></DATA>
                    </COL>
                    <COL>
                        <DATA><xsl:value-of select="str[@name='postcode']"/></DATA>
                    </COL>
                    <COL>
                        <DATA><xsl:value-of select="str[@name='straatnaam']"/></DATA>
                    </COL>
                    <COL>
                        <DATA><xsl:value-of select="str[@name='huis_nlt']"/></DATA>
                    </COL>
                </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Als je het adres niet precies hebt kan je eerst met bijna dezelfde query de mogelijkheden controleren:

"http://geodata.nationaalgeoregister.nl/locatieserver/suggest?wt=xml&q=" & GetAsURLEncoded ( "Slingeplein and 1 and Rotterdam" )

en dan kan je mogelijke weergavenamen oplepelen met deze xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="Weergavenaam" TYPE="TEXT"/> 
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="/response/result/doc">
                <ROW>
                    <COL>
                        <DATA><xsl:value-of select="str[@name='weergavenaam']"/></DATA>
                    </COL>
                </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

 

Wil je meer weten over de beschikbare gegevens, dan kan je dit nakijken op: https://www.pdok.nl/datasets/

Link naar reactie
  • 0

Beste @menno,

Hartelijk bedankt voor uw uitgebreide reacties en voorstellen. Ik ben er erg blij mij.

Ik snap nu inderdaad waarom de parser niets met deze XML kan doen en het dus niet aan de FM-instellingen of de XSL ligt.

Ik zie dat ik dit probleem nog op een andere manier kan omzeilen. Door het limiet in de query op 1 te zetten, geeft het HTTP-verzoek maar één antwoord terug. Nu lukt het me wel om de gehele inhoud van de XML in een (globaal) veld te krijgen. Vervolgens kan ik met de functie XMLExtract de data van de unieke tags eruit halen. Postcode, plaats en naam komen namelijk maar één keer voor.

Bedankt voor de tip van het nationaal georegister. Die is nog beter. Ik ga ermee aan de slag!

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...