XML file inlezen
ik kom er nu niet meer uit. heb alle php.net artikelen betreffende bestandsysteem doorgelopen maar krijg het niet voor elkaar.
wat ik wil bereiken.
ik haal via een externe site een xml bestand op.
deze wordt gegenereerd door een php bestand. dus het is op de externe site een download.
hierdoor kan ik hem niet uitlezen direct.
dus waarschijnlijk moet ik hem eerst opslaan op de server waar de php script draaien?
hoe kan ik deze wegschrijven naar een map.
file() fwrite() file_get_contents() al geprobeerd maar lukt me niet.
of kan ik hem gewoon openen en dan mijn dingen eruit halen die ik nodig heb. ?
heb het nodig voor dit gedeelte van de code
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
//$data = simplexml_load_string($url);
$data = simplexml_load_string($url);
echo "<pre>";
print_r($data);
echo "</pre>";
if($data) {
echo "<pre>".print_r($data,true)."</pre>";
} else {
// de XML kan niet worden uitgelezen, toon de foutmeldingen!
echo "XML-feed kan niet geladen worden:\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
//$data = simplexml_load_string($url);
$data = simplexml_load_string($url);
echo "<pre>";
print_r($data);
echo "</pre>";
if($data) {
echo "<pre>".print_r($data,true)."</pre>";
} else {
// de XML kan niet worden uitgelezen, toon de foutmeldingen!
echo "XML-feed kan niet geladen worden:\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
Gewijzigd op 15/12/2020 10:12:14 door Michael vanDijk
Je zou deze gewoon moeten kunnen ophalen, ook al zit er 'forced download' header aan vast. Wat gaat er mis? Wat geeft file_get_contents terug?
- Ariën - op 15/12/2020 10:12:15:
Je zou deze gewoon moeten kunnen ophalen, ook al zit er 'forced download' header aan vast. Wat gaat er mis? Wat geeft file_get_contents terug?
dat ik moet inloggen, terwijl dat als ik het met een xml bestand doe wat daar wel op de server staat het gewoon werkt..
hij geeft op die link een download aan. dus ik moet iets hebben dat hij dat bestand download en tijdelijk opslaat of iets dergelijks
Gewijzigd op 15/12/2020 10:34:07 door Michael vanDijk
Gewijzigd op 15/12/2020 10:34:59 door - Ariën -
- Ariën - op 15/12/2020 10:34:22:
Als je een melding krijgt over inloggen, dan zal je authenticatie dus niet kloppen. Met de juiste 'sleutel' kan je erbij.
dat is juist het probleem, inloggen werkt perfect. alleen komt hij op de "download" pagina en die geeft dan aan dat er niks is.
als ik de link in de browser zet krijg ik een bestand aangeboden. daar moet ik wat mee gaan doen.
Toevoeging op 15/12/2020 11:18:06:
- Ariën - op 15/12/2020 10:34:22:
Als je een melding krijgt over inloggen, dan zal je authenticatie dus niet kloppen. Met de juiste 'sleutel' kan je erbij.
dat is juist het probleem, inloggen werkt perfect. alleen komt hij op de "download" pagina en die geeft dan aan dat er niks is.
als ik de link in de browser zet krijg ik een bestand aangeboden. daar moet ik wat mee gaan doen.
Weet je ook hoe het "XML genererende PHP script" werkt? Verwacht die misschien nog een speciale header, of controleert ie of een header een bepaalde waarde heeft? Je browser geeft standaard namelijk een zwik headers mee, dus misschien moet je er daar een van "kopiëren" (of "voor de zekerheid" gewoon allemaal meegeven).
Zit er dus een inlogactie tussen voordat je het kan bekijken? Of is het enkel een speciale header die er verwacht wordt?
- Ariën - op 15/12/2020 12:26:41:
Zit er dus een inlogactie tussen voordat je het kan bekijken? Of is het enkel een speciale header die er verwacht wordt?
die inlog actie is er al en die werkt. alleen normaal staat het xml bestand dan daar op de server, bij deze bied hij de xml aan als download...
daaromd at ik dacht/denk dat het iets moet zijn van bestand downloaden en kopieeren op de server dan het bestand parsen op de eigen server en dan de data in de database duwen.
Toevoeging op 15/12/2020 12:45:26:
ik krijg trouwens als ik een reply doe deze foutmelding :
Class Egulias\EmailValidator\EmailValidator does not exist
Wat geeft file_get_contents nou precies terug?
En die Class-foutmelding op het forum is bekend bij Bas. Ik zal hem er nog even aan herinneren.
het heeft met de mail-notificatie te maken die eerder stuk was, maar ergens nog bugt.
Gewijzigd op 15/12/2020 13:22:55 door - Ariën -
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
print_r($data);
$data = simplexml_load_string( $data );
geeft een witte pagina
en daaronder komt vanaf simplexml_load_string
de volgende fout
<b>Warning</b>: simplexml_load_string(): Entity: line 38: parser error : Opening and ending tag mismatch: link line 9 and head in <b>/var/www/vhosts/.nl/httpdocs/power/feed3.php</b> on line <b>31</b><br />
<br />
<b>Warning</b>: simplexml_load_string(): </head> in <b>/var/www/vhosts/.nl/httpdocs/power/feed3.php</b> on line <b>31</b><br />
<br />
<b>Warning</b>: simplexml_load_string(): ^ in <b>/var/www/vhosts/.nl/httpdocs/power/feed3.php</b> on line <b>31</b><br />
Gewijzigd op 15/12/2020 14:08:46 door Michael vanDijk
Op regel 9
Hier wordt $data overschreven?
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$data = simplexml_load_string( $data );
// echo "<pre>";
// print_r($data);
// echo "</pre>";
//$rss = Feed::loadRss($data, $user, $pass);
foreach ($data->channel->item as $item) {
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
$timestamp = strtotime($item->pubDate);
$sql = "SELECT * FROM feed WHERE timestamp = '" . (int)$timestamp . "'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
}
} else {
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$xml= simplexml_load_string($data);
echo "<pre>".print_r($xml,true)."</pre>";
?>
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$usernamehttp:$passwordhttp")
)
));
$data = file_get_contents($url, false, $context);
$xml= simplexml_load_string($data);
echo "<pre>".print_r($xml,true)."</pre>";
?>
Wat geeft dit?
Gewijzigd op 15/12/2020 15:10:19 door - Ariën -
Warning: simplexml_load_string(): </head> in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Warning: simplexml_load_string(): ^ in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
Warning: simplexml_load_string(): Entity: line 301: parser error : Specification mandate value for attribute download in /var/www/vhosts/.nl/httpdocs/power/feed3.php on line 29
En wat echo'ed $data voor output, waarbij je de simplexml_load_string even wegcomment.
Want een beetje kapotte xml geeft die foutmelding, maar ook een html-error pagina die je zou vertellen dat je eerst nog moet inloggen of iets dergelijks.
Quote:
als ik de link in de browser zet krijg ik een bestand aangeboden
Waarschijnlijk geeft de webserver een andere output. Gebruik je wel dezelfde HTTP request headers, zoals een UA-string?
Misschien gaat het beter/gemakkelijker wanneer je cURL gebruikt?
Ad Fundum op 17/12/2020 21:17:30:
Waarschijnlijk geeft de webserver een andere output. Gebruik je wel dezelfde HTTP request headers, zoals een UA-string?
Misschien gaat het beter/gemakkelijker wanneer je cURL gebruikt?
Quote:
als ik de link in de browser zet krijg ik een bestand aangeboden
Waarschijnlijk geeft de webserver een andere output. Gebruik je wel dezelfde HTTP request headers, zoals een UA-string?
Misschien gaat het beter/gemakkelijker wanneer je cURL gebruikt?
ik gebruik dezelfde code als voor een andere feed en die werkte perfect.
alleen die andere feed heeft een xml bestand op de server staan en deze pusht hem als download.
hier gaat het dan ook op fout.
ik zoek dus iets dat hij dat bestand accepteerd en dan pas verwerkt en hier loop ik vast.
ik heb al geprobeerd met file het bestand op te slaan maar dat lukte me niet.
iemand nog een idee om het met zoveel mogelijk de huidige code voor elkaar te krijgen ?
Toevoeging op 22/12/2020 14:33:36:
als ik de link in de adresbalk zet en enter dan krijg ik een xml bestand met goede waardes dus dat is verder goed.
kan ik dat xml bestand makkelijk opslaan op mijn eigen server en dan verwerken ?
Ikzelf haal elke dag geautomatiseerd een sloot XML's/RSS-feeds op waarvan ik weet dat er een aantal feed bijzitten met een 'geforceerde downloadheader'. Hier heb ik echt 0,0 last van. Puur omdat file_get_contents of cURL die gewoon netjes negeert.
Dus waarom steeds die tunnelvisie op dit gedrag?
Het belangrijkste is al genoemd: Bekijk eens wat je nou terug krijgt. Daar staat vast wel een aanwijzing in. Misschien mis je iets in een authenticatie, of een bepaalde instelling en krijg je een foutmelding wat je script dus niet verwacht. Uit je foutmeldingen kan ik al opmaken dat je een HTML-document terug lijkt te krijgen omdat er gesproken werd over een </head>.
Gewijzigd op 22/12/2020 15:32:23 door - Ariën -
terwijl de inlog werkt voor de andere feeds daar is dus niks mis mee... het is het zelfde account zelfde user.
hoe zou ik het met curl moeten doen ik zie nergens een voorbeeld hoe ik dat kan implementeren.
het is geen tunnelvisie (misschien trouwens wel ;-) maar enige variable die veranderd is dat hij nu die xml pusht en niet verwerkt daarom dacht ik dat het toch echt met die download te maken had...
hij kan hem toch niet verwerken zonder ergens een temp bestand te maken of het bestand te downloaden ?
Toevoeging op 23/12/2020 09:43:19:
function curl2($url, $fields = array(), $auth = 'user:pass'){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
if($auth){
curl_setopt($curl, CURLOPT_USERPWD, "$auth");
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
}
if($fields){
$fields_string = http_build_query($fields);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
}
$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header_string = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$header_rows = explode(PHP_EOL, $header_string);
$header_rows = array_filter($header_rows, trim);
foreach((array)$header_rows as $hr){
$colonpos = strpos($hr, ':');
$key = $colonpos !== false ? substr($hr, 0, $colonpos) : (int)$i++;
$headers[$key] = $colonpos !== false ? trim(substr($hr, $colonpos+1)) : $hr;
}
foreach((array)$headers as $key => $val){
$vals = explode(';', $val);
if(count($vals) >= 2){
unset($headers[$key]);
foreach($vals as $vk => $vv){
$equalpos = strpos($vv, '=');
$vkey = $equalpos !== false ? trim(substr($vv, 0, $equalpos)) : (int)$j++;
$headers[$key][$vkey] = $equalpos !== false ? trim(substr($vv, $equalpos+1)) : $vv;
}
}
}
//print_rr($headers);
curl_close($curl);
return array($body, $headers);
}
list($d['body'], $d['headers']) = curl('php link naar xml', array(q => '', auth => '$usernamehttp:$passwordhttp'));
//POST to google.com with POST var "q" as "123"
echo '<pre>';
print_r($d);
echo '</pre>';
zoiets ?
dit werkt voor de oude link perfect.
voor de link naar de download krijg ik in de body "Redirecting hoop html tekst "
[headers] => Array
(
[0] => HTTP/1.1 302 Found
[Date] => Wed, 23 Dec 2020 08:51:50 GMT
[Server] => Apache
[Location] => /login.php
[Content-Length] => 2609
[Connection] => close
[X-Frame-Options] => DENY
[X-Content-Type-Options] => nosniff
[Content-Type] => Array
(
[0] => text/html
[charset] => UTF-8
)
[X-XSS-Protection] => Array
(
[1] => 1
[mode] => block
)
[Strict-Transport-Security] => Array
(
[max-age] => 3153600
[2] =>
)
)
)
Gewijzigd op 23/12/2020 09:52:29 door Michael vanDijk
Hoe ziet de output eruit?