extern rss-bestand inlezen
www.emerce.nl heeft een rss bestand met het laatste nieuws. Ik wil automatisch de laatste nieuwsberichten op mijn website hebben. Ik heb al heel het internet nagezocht over hoe ik een extern rss bestand moet uitlezen, maar ik kom er niet uit.
Dit heb ik als code.
Code (php)
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
/////////////////////
// cls = class //
// p_ = parameter //
// m_ = member //
// a = array //
// n = numeriek //
// s = string //
// obj = object //
/////////////////////
$objErrorHandler = new clsErrorHandler();
define('XML_URL', 'http://www.emerce.nl/rss/hea.rss');
define('SIMPLEXML', 1);
define('DOM', 2);
define('XPATH', 3);
class clsErrorHandler {
private $m_sError;
function __construct(){
error_reporting(E_ALL);
set_error_handler(array($this, 'errorHandler'));
}
function errorHandler($p_nType, $p_sBericht, $p_sBestand, $p_nRegel){
$p_sError = '';
$p_sError = '
<p>
<span style="font-weight:bold;">Fout ['.$p_nType.']:</span> '.$p_sBericht.'<br>
<span style="font-weight:bold;">Regel:</span> '.$p_nRegel.'
</p>';
$this->m_sError .= $p_sError;
}
function getError(){
if ($this->m_sError){
$p_sErrorKader = '';
$p_sErrorKader = '
<div style="position:absolute; right:5px; top:5px; width:400px; border:1px solid #000000; padding:2px;">
<span style="font-size:14px; font-weight:bold; color:#993300;">Fout(en) op deze pagina</span><br>
'.$this->m_sError.'
</div>';
return $p_sErrorKader;
}
}
}
class clsLeesXML {
private $m_nParser = 0;
function __construct($p_nParser){
$this->m_nParser = $p_nParser;
}
function laadXML(){
$p_sInhoud = '';
switch ($this->m_nParser){
case SIMPLEXML:
if ($objSimpleXML = simplexml_load_file(XML_URL)){
foreach ($objSimpleXML->channel->item as $objItem){
$p_sInhoud .= '
<a href="'.$objItem->link.'">'.$objItem->title.'</a><br>';
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
case DOM:
$objDOM = new DOMDocument();
if ($objDOM->load(XML_URL)){
$objRootElement = $objDOM->documentElement;
$aItemElementen = $objRootElement->getElementsByTagName('item');
foreach ($aItemElementen as $objHuidigElement){
$aLinkElementen = $objHuidigElement->getElementsByTagName('link');
$aTitleElementen = $objHuidigElement->getElementsByTagName('title');
foreach ($aLinkElementen as $objItem){
$p_sInhoud .= '
<a href="'.$objItem->textContent.'">';
}
foreach ($aTitleElementen as $objItem){
$p_sInhoud .= $objItem->textContent.'</a><br>';
}
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
case XPATH:
if ($objSimpleXML = simplexml_load_file(XML_URL)){
foreach ($objSimpleXML->XPath('//item') as $objDitItem){
$p_sInhoud .= '
<a href="'.$objDitItem->link.'">'.$objDitItem->title.'</a><br>';
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
default:
$p_sInhoud = 'Er is een fout opgetreden bij het selecteren van een XML-parser!';
}
return $p_sInhoud;
}
}
//Titel van het document
$sPagina = '
<h1>Nieuws vanuit emerce.nl</h1>';
//Het ophalen van de nieuwsberichten m.b.v. SimpleXML
$objXML = new clsLeesXML(SIMPLEXML);
$sPagina .= '
<h2>Ophalen met behulp van SimpleXML</h2>
'.$objXML->laadXML().'<br>';
//Het ophalen van de nieuwsberichten m.b.v. DOM
$objXML = new clsLeesXML(DOM);
$sPagina .= '
<h2>Ophalen met behulp van DOM</h2>
'.$objXML->laadXML().'<br>';
//Het ophalen van de nieuwsberichten m.b.v. XPath
$objXML = new clsLeesXML(XPATH);
$sPagina .= '
<h2>Ophalen met behulp van Xpath</h2>
'.$objXML->laadXML();
$sPagina .= $objErrorHandler->getError();
//het tonen van de opgehaalde nieuwsberichten
echo '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>XML document uitlezen</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
BODY {
font-family:Arial, Helvetica, sans-serif;
font-size:12px;
}
H1 {
font-size:18px;
}
H2 {
font-size:14px;
margin:2px 0px 0px 0px;
}
</style>
</head>
<body>
'.$sPagina;
echo '
</body>
</html>';
unset($sPagina);
?>
/////////////////////
// cls = class //
// p_ = parameter //
// m_ = member //
// a = array //
// n = numeriek //
// s = string //
// obj = object //
/////////////////////
$objErrorHandler = new clsErrorHandler();
define('XML_URL', 'http://www.emerce.nl/rss/hea.rss');
define('SIMPLEXML', 1);
define('DOM', 2);
define('XPATH', 3);
class clsErrorHandler {
private $m_sError;
function __construct(){
error_reporting(E_ALL);
set_error_handler(array($this, 'errorHandler'));
}
function errorHandler($p_nType, $p_sBericht, $p_sBestand, $p_nRegel){
$p_sError = '';
$p_sError = '
<p>
<span style="font-weight:bold;">Fout ['.$p_nType.']:</span> '.$p_sBericht.'<br>
<span style="font-weight:bold;">Regel:</span> '.$p_nRegel.'
</p>';
$this->m_sError .= $p_sError;
}
function getError(){
if ($this->m_sError){
$p_sErrorKader = '';
$p_sErrorKader = '
<div style="position:absolute; right:5px; top:5px; width:400px; border:1px solid #000000; padding:2px;">
<span style="font-size:14px; font-weight:bold; color:#993300;">Fout(en) op deze pagina</span><br>
'.$this->m_sError.'
</div>';
return $p_sErrorKader;
}
}
}
class clsLeesXML {
private $m_nParser = 0;
function __construct($p_nParser){
$this->m_nParser = $p_nParser;
}
function laadXML(){
$p_sInhoud = '';
switch ($this->m_nParser){
case SIMPLEXML:
if ($objSimpleXML = simplexml_load_file(XML_URL)){
foreach ($objSimpleXML->channel->item as $objItem){
$p_sInhoud .= '
<a href="'.$objItem->link.'">'.$objItem->title.'</a><br>';
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
case DOM:
$objDOM = new DOMDocument();
if ($objDOM->load(XML_URL)){
$objRootElement = $objDOM->documentElement;
$aItemElementen = $objRootElement->getElementsByTagName('item');
foreach ($aItemElementen as $objHuidigElement){
$aLinkElementen = $objHuidigElement->getElementsByTagName('link');
$aTitleElementen = $objHuidigElement->getElementsByTagName('title');
foreach ($aLinkElementen as $objItem){
$p_sInhoud .= '
<a href="'.$objItem->textContent.'">';
}
foreach ($aTitleElementen as $objItem){
$p_sInhoud .= $objItem->textContent.'</a><br>';
}
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
case XPATH:
if ($objSimpleXML = simplexml_load_file(XML_URL)){
foreach ($objSimpleXML->XPath('//item') as $objDitItem){
$p_sInhoud .= '
<a href="'.$objDitItem->link.'">'.$objDitItem->title.'</a><br>';
}
} else {
$p_sInhoud = 'Kan het XML document niet laden';
}
break;
default:
$p_sInhoud = 'Er is een fout opgetreden bij het selecteren van een XML-parser!';
}
return $p_sInhoud;
}
}
//Titel van het document
$sPagina = '
<h1>Nieuws vanuit emerce.nl</h1>';
//Het ophalen van de nieuwsberichten m.b.v. SimpleXML
$objXML = new clsLeesXML(SIMPLEXML);
$sPagina .= '
<h2>Ophalen met behulp van SimpleXML</h2>
'.$objXML->laadXML().'<br>';
//Het ophalen van de nieuwsberichten m.b.v. DOM
$objXML = new clsLeesXML(DOM);
$sPagina .= '
<h2>Ophalen met behulp van DOM</h2>
'.$objXML->laadXML().'<br>';
//Het ophalen van de nieuwsberichten m.b.v. XPath
$objXML = new clsLeesXML(XPATH);
$sPagina .= '
<h2>Ophalen met behulp van Xpath</h2>
'.$objXML->laadXML();
$sPagina .= $objErrorHandler->getError();
//het tonen van de opgehaalde nieuwsberichten
echo '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>XML document uitlezen</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
BODY {
font-family:Arial, Helvetica, sans-serif;
font-size:12px;
}
H1 {
font-size:18px;
}
H2 {
font-size:14px;
margin:2px 0px 0px 0px;
}
</style>
</head>
<body>
'.$sPagina;
echo '
</body>
</html>';
unset($sPagina);
?>
Als ik dit laad, dan doet hij erg lang met laden en geeft de melding dat 30 seconden zijn overscheden, of hij geeft een 500 error.
Een intern XML bestand kan hij wel uitlezen, maar waarom kan dat dan niet via extern, zoals hierboven?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
//define the source of the feed
define(feed,'http://feed.phpnieuws.nl/rss.xml');
//recive file form server
$xml_feed = file_get_contents(feed);
//create a xml phraser
$xml_praser = xml_parser_create();
//tell the vars to the xml phrasers
xml_parse_into_struct($xml_praser,$xml_feed,$xml_keys,$xml_index);
//lets phrase ^^
xml_parser_free($xml_praser);
//generate the headlines
for($i = 0; !empty($xml_index['TITLE'][$i]); $i++){
if($i == 0){
echo '<strong>Headlines van:<a href="'.$xml_keys[$xml_index['LINK'][$i]]['value'].'">PHPnieuws</a></strong><br />';
}else{
echo '<a href="'.$xml_keys[$xml_index['LINK'][$i]]['value'].'">'.$xml_keys[$xml_index['TITLE'][$i]]['value'].
'</a><br />
';
}
}
?>
//define the source of the feed
define(feed,'http://feed.phpnieuws.nl/rss.xml');
//recive file form server
$xml_feed = file_get_contents(feed);
//create a xml phraser
$xml_praser = xml_parser_create();
//tell the vars to the xml phrasers
xml_parse_into_struct($xml_praser,$xml_feed,$xml_keys,$xml_index);
//lets phrase ^^
xml_parser_free($xml_praser);
//generate the headlines
for($i = 0; !empty($xml_index['TITLE'][$i]); $i++){
if($i == 0){
echo '<strong>Headlines van:<a href="'.$xml_keys[$xml_index['LINK'][$i]]['value'].'">PHPnieuws</a></strong><br />';
}else{
echo '<a href="'.$xml_keys[$xml_index['LINK'][$i]]['value'].'">'.$xml_keys[$xml_index['TITLE'][$i]]['value'].
'</a><br />
';
}
}
?>
Volgens mij gaat dit sneller :P
Wat ik heb ontdekt is dat het op mijn Abyss server niet goed gaat, maar dat het online wel goed gaat.
www.bvveen.com/phphulp.php
Maar mijn host ondersteund geen PHP5, dus kan ik mijn script online niet werkend krijgen.
Is er iemand die wil controleren of mijn bovenstaande script wel werkt? Aan die informatie heb ik namelijk heel veel. Ik wil namelijk verschillende manieren tonen om xml uit te lezen.
Alvast bedankt voor de moeite.
Misschien vind je het script wel handig voor het afhandelen van errors en het lezen van xml bestanden.
Ik wil alleen weten of mijn code de juiste is om rss bestanden uit te lezen.
Ik weet niet of ik php5 heb maar ik wil het best uittesten van eris of van jou?
Die van mij werkt zeker op php 4.3.x en PHP5 ;)
Ja die van Eris werkt bij mij ook. Kalle, ik denk dat jij geen PHP5 hebt, want jij krijgt error bij
private $m_sError;
Dit kan php4 niet lezen, daar is het:
var $m_sError;
Ik wil namelijk ook mijn scriptje sturen naar een bedrijf voor tbv een afstudeerplek, daarom is het zo belangrijk.
Zijn er nog mensen die het kunnen testen met PHP5?
Gewijzigd op 11/01/2006 20:11:00 door Barman V
Graag gedaan, sorry dat ik je niet verder kan helpen.
Maar dit moet echt getest worden met PHP5, want PHP4 kent geen simpleXML, kan de DOM niet laden en kan dus ook niet met de XPath werken. PHP5 kan dat zeker wel, maar volgens mij staat mijn webserver zo geconfigureerd dat hij geen contact kan maken met een externe server.
Als er nog mensen zijn die willen testen. Heel graag.
Het wertk hier wel alleen wel erg langzaam
Het resultaat van de SAX manier is te zien op:
http://www.bvveen.com/emerce.php
Ik heb maar alles omgebouwd, zodat het werkt met PHP4. Hij doet het nu niet met de DOM, SIMPLEXML en XPath helaas. Maar wel met SAX.