XML van een ander domein

Door Nee nee, 18 jaar geleden, 4.763x bekeken

Met dit kleine scriptje kun je van een XML file van een andere server laden in een string.
Vervolgens kun je dit net zo gebruiken als een XML die wel op je server staat.

Het is niet een heel moelijk script, maar ik heb er lang naar gezocht hoe ik dit moest doen.

Het kan volgens mij ook voor RSS gebruikt worden.

Gesponsorde koppelingen

PHP script bestanden

  1. xml-van-een-ander-domein

 

Er zijn 16 reacties op 'Snippets'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Gert-jan
gert-jan
18 jaar geleden
 
0 +1 -0 -1
De functie simplexml_load_file() kan ook externe xml bestanden ophalen.
Frank -
Frank -
18 jaar geleden
 
0 +1 -0 -1
Een kleine opmerking: Variabelen horen niet tussen quotes, het zijn tenslotte variabelen.

Fout: "$feed_url"
Goed: $feed_url
Jesper Diovo
Jesper Diovo
18 jaar geleden
 
0 +1 -0 -1
Vervalt niet ook dit als je host externe URLs heeft uitgeschakeld?
Nee nee
nee nee
18 jaar geleden
 
0 +1 -0 -1
@pgFrank Oops.... ik heb het veranderd

@gert-jan Dat werkt in ieder geval niet bij mij, misschien is het uitgeschakeld door mijn host,

@Jezper Ligt er natuurlijk uit wat uitgeschakeld is, zo te zien door de reactie van gert-jan heeft dit script het uitschakelen hiervan dus omzeild
Steen
steen
18 jaar geleden
 
0 +1 -0 -1
Wat is er mis met file_get_contents?
Toby hinloopen
toby hinloopen
18 jaar geleden
 
0 +1 -0 -1
curl?
nooit van gehoort.

file_get_contents() werkt toch prima via http?
Kees V
Kees V
18 jaar geleden
 
0 +1 -0 -1
Inderdaad, file_get_contents() en simplexml_load_file() werken prima.
Maar niet als allow_url_fopen = Off is ingesteld in php.ini. En dat is bij steeds meer hostingbedrijven tegenwoordig het geval.

Als het meezit hebben die bedrijven dan de cURL-library geïnstalleerd, waardoor je toch nog externe xml/rss-feeds kunt binnenhalen.

Verder werkt cURL veel sneller dan file_get_contents(). Dus als cURL aanwezig is verdient die de voorkeur.
Iltar van der berg
iltar van der berg
18 jaar geleden
 
0 +1 -0 -1
Je moet je host aan jou aanpassen, niet jij aan je host. Je weet wat je wilt en nodig hebt, daarna zoek je een host die dat bied. Dus:
Quote:
Maar niet als allow_url_fopen = Off is ingesteld in php.ini. En dat is bij steeds meer hostingbedrijven tegenwoordig het geval.


Dan zoek je een host die dat wel kan. Of je regelt je eigen server.
Nee nee
nee nee
18 jaar geleden
 
0 +1 -0 -1
@iltar van der berg
Ik ben er daar niet mee eens, want ten eerste krijg je bij je host bijna nooit de instellingen van php te zien, dat kun je natuurlijk opvragen, maar dat kost weer tijd enz.
En soms heb je al een host en heb je geen zin om overstappen en dan is je website ook altijd even offline en het kost veel gedoe. Bovendien als je helemaal tevreden bent met je host, en
allow_url_fopen = Off
en je ook gwn kan verwhelpen met dit script, lijkt verwisselen van host mij zeer raar


18 jaar geleden
 
0 +1 -0 -1
Psst kijk eens in de manual (function.simplexml-element-construct):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
#Example #2 Create a SimpleXMLElement object from a URL

$sxe = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);
echo $sxe->asXML();

?>

Weg met dit snippit dus.
Nee nee
nee nee
18 jaar geleden
 
0 +1 -0 -1
@Karl dat staat er wel, maar dat werkt bij mij gewoon niet, ik heb dat allang geprobeerd.

Dus wat mij betreft bijft DIT snippet gewoon.
Kees V
Kees V
18 jaar geleden
 
0 +1 -0 -1
Dit snippet gaat over een toepassing van cURL, niet over het vervolg met SimpleXML.
Daarom is de reactie van Karl niet terzake.

Bovendien werkt zijn voorbeeld niet bij allow_url_fopen = Off, maar wel met het cURL-alternatief uit dit snippet.
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
18 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/**
 * Laad een XML bestand naar een array.
 *
 * @param string $xml_file De locatie van het XML bestand (kan zowel intern and extern zijn)
 */

function xml_read_file( $xml_file )
{

     $xml = xml_parser_create();
     xml_parse_intro_struct( $xml, @file_get_contents( $xml_file ), $xml_return_array );
     xml_parser_free( $xml );
     return $xml_return_array;
}

?>
Geert
Geert
18 jaar geleden
 
0 +1 -0 -1
eeehm... ToySoldier... jou snippet maakt ook gebruik van file_get_contents()

En wat zei Kees een paar reacties eerder?
Quote:
Inderdaad, file_get_contents() en simplexml_load_file() werken prima.
Maar niet als allow_url_fopen = Off is ingesteld in php.ini. En dat is bij steeds meer hostingbedrijven tegenwoordig het geval.
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
18 jaar geleden
 
0 +1 -0 -1
@ Geert: Excuses, niet goed opgelet. Wist niet dat die niet werkte zonder allow_url_fopen.. :x
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Kees V
Kees V
18 jaar geleden
 
0 +1 -0 -1
Het inlezen van xml-bestanden met cURL-functies gaat sneller dan met file_get_contents(), maar de cURL-library is niet altijd aanwezig op de server.
Een ander verschil is dat cURL alleen volledige url's accepteert, maar file_get_contents() ook lokale paden.

Twee cURL-opties zijn nog handig bij het inlezen van RSS-feeds:
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Hiermee worden ook redirects gevolgd. Dit komt oa. van pas bij RSS-feeds van feedburner.com.

- curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
Hiermee doet het script zich voor als browser. Sommige RSS-feeds controleren dit blijkbaar en 'leveren' alleen aan browsers.

Hiermee kom ik tot de volgende oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$url
= 'http://feeds.feedburner.com/blabbermouth/';

if (preg_match('#^((ht|f)tp(s?)://)#i', $url) && function_exists('curl_init')) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  $xml_data = curl_exec($ch);
  curl_close($ch);
}

else {
  $xml_data = file_get_contents($url);
}


if ($xml_data) {
  $rss = new SimpleXMLElement($xml_data);
  echo $rss->channel->link;
  echo '<br>';
  echo $rss->channel->title;
  foreach($rss->channel->item as $item) {
    echo '<h4>'  . $item->title . '</h4>';
    echo '<div>' . $item->description . '</div>';
    echo '<div>' . $item->pubDate . '</div>';
  }
}

?>

Het staartje (de RSS-parser) is hier eigenlijk niet terzake, maar het maakt wel duidelijk wat je met de ingelezen xml-gegevens kan doen.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. xml-van-een-ander-domein

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.