Jump to content
  • 0

Probleem importeren XML via HTTP-verzoek


Meeuwis

Question

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 to comment

3 answers to this question

Recommended Posts

  • 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 to comment
  • 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 to comment
  • 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 to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...