Verwerken bestand in PHP met een prefix voor de velden

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • HappyHug
  • Registratie: December 2007
  • Laatst online: 10-02-2023
Mijn vraag
...
Ik gebruik PHP om een datafeed in te lezen en te verwerken.
Dat ging altijd goed maar nu hebben ze een prefix voor de velden gezet.

In het voorbeeld zit in de datafeeed het veld <description> als onderdeel van product[0].
Eerst stond in de datafeed bijvoorbeeld: <description>Hier de omschrijving blabla</description>
In mij PHP programma staat dan: $omschrijving=$xml->product[0]->description;

Nu staat er: <g:description>Hier de omschrijving blabla</g:description>
$omschrijving=$xml->product[0]->description; werkt nu niet meer
en $omschrijving=$xml->product[0]->p:description; geeft een syntax fout (logisch ook wel).

Hoe kan ik dat veld uit de datafeed nu in mijn $omschrijving veld krijgen?
Die toegevoegde p: is dus het probleem.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 01-10 22:36

Cyphax

Moderator LNX
Da's een xml namespace (die p), die moet je even registreren (simplexml)
https://www.php.net/manua...egisterxpathnamespace.php
Als je een andere manier hebt om de xml uit te lezen moet je even op zoek naar hoe je omgaat met die namespaces daarin, maar dan heb je in elk geval een idee van waar je 't zoeken moet. :P

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • KRASH
  • Registratie: December 2002
  • Laatst online: 09:48

KRASH

Juist ja...

Netjes is anders, maar je kan het gewoon uitlezen:

code:
1
$omschrijving=$xml->product[0]->{"p:description"};

Acties:
  • 0 Henk 'm!

  • HappyHug
  • Registratie: December 2007
  • Laatst online: 10-02-2023
Dit werkt niet.
In mijn php programma staat op de regels 9 en 10:
echo 'ns2.name: '.$xml->product[0]->{"ns2:name"};
echo 'description:'.$xml->product[0]->{"ns2:description"};
Ik krijg de foutmelding:
PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 9
ns2.name: PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 10 description:

In de datafeed staat (1e regels):
<result version="3.0">
<productHeader>
<totalHits>705</totalHits>
</productHeader>
<products>
<product groupingId="sku1722052" language="nl">
<ns2:name>Apple Iphone Se (2022) - Starlight 128 Gb</ns2:name>
<ns2:description>
Besturingssysteem: iOS 15 Geheugencapaciteit: 128 GB Specificaties camera: 12 megapixel Beeldschermdiagonaal (cm/inch): 11.94 cm / 4.7 inch Processor: A15 Bionic-chip + Neural Engine De iPhone SE (2022) is een krachtige smartphone van Apple met indrukwekkende specificaties voor een aantrekkelijke prijs. Deze Apple-smartphone heeft een krachtige processor die Apple zelf heeft ontworpen, namelijk de razendsnelle én zuinige A15 Bionic-chip. Samen met een prachtige camera en lange accuduur, zal de iPhone SE (2022) je niet teleurstellen. Dit krijg je erbij: iPhone SE / USB‑kabel naar Lightning / Handleiding
</ns2:description>

Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
Je kunt hier PHP: SimpleXMLElement::children voor gebruiken.

Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Je moet even de foutmeldingen opnieuw lezen en proberen te begrijpen. Je probeert een property ns2:name van een non-object $xml->product[0] uit te lezen. Je probleem zit dus niet waar je denkt dat het zit. Hoe definieer je $xml? Want als dat is wat ik denk dat het is dan moet je nog eens gaan kijken welke andere zaken er veranderd zijn in het formaat van "version 3.0" tov de eerdere versie. Ik gok dat dat zoiets was als
XML:
1
2
3
4
5
6
7
8
<result version="2.1">
    <productHeader>
        <totalHits>705</totalHits>
    </productHeader>
    <product groupingId="sku1722052" language="nl">
        <name>Apple Iphone Se (2022) - Starlight 128 Gb</name>
    </product>
</result>

maar dat is nu niet meer het formaat.

[ Voor 26% gewijzigd door DataGhost op 01-02-2023 23:56 ]


Acties:
  • 0 Henk 'm!

  • HappyHug
  • Registratie: December 2007
  • Laatst online: 10-02-2023
Beste DataGhost,
Het zou best kunnen dat het idd 2.1 was maar ik ben niet zo goed thuis in PHP om nu te begrijpen wat ik moet wijzigen om het toch te kunnen lezen.
Is echo 'ns2.name: '.$xml->product[0]->{"ns2:name"}; helemaal fout of kan dit met een kleine aanpassing toch zo?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

In dit subforum is het wel de bedoeling dat je een beetje kan programmeren/debuggen, ik gok dat je dat nog niet (goed) kan en ik weet niet zeker of je het wilt leren of dat je gewoon een snelle oplossing wilt zonder daar zelf tijd aan te hoeven besteden. Ik kan het je waarschijnlijk zo vertellen (ook al heb ik de rest van je code niet gezien dus moet ik heel veel aannames maken) maar daar leer je niks van. Dus daarom de vraag of je de foutmelding die je krijgt wel begrijpt of goed genoeg gelezen hebt om te zien wat er aan de hand is. De melding zegt namelijk redelijk letterlijk wat er mis is.
spoiler:
Basically zegt de melding dat $xml->product[0] niet bestaat. En uit iets wat niet bestaat kan je niks uitlezen natuurlijk.

Acties:
  • 0 Henk 'm!

  • HappyHug
  • Registratie: December 2007
  • Laatst online: 10-02-2023
Ik snap dat hij dat zegt maar op deze manier (zonder die ns2:) heb ik die datafeed altijd verwerkt.
De datafeed is ingelezen en voor zover ik weet moet product[0] gewoon bestaan.
Overigens krijg ik geen melding op $xml->product[0]
Nu in programma regel 8 t/m 15:
echo 'test';
echo 'product0:'.$xml->product[0];
$titel=$xml->product[0]->{"ns2:name"};
$omschrijving=$xml->product[0]->{"ns2:description"};
echo 'ns2.name: '.$titel;
echo 'omschrijving:'.$omschrijving;
echo 'test klaar';

Resultaat:
testproduct0:PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 10
PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 11
ns2.name: omschrijving:test klaarPHP
Geen foutmelding op regel 9

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HappyHug schreef op maandag 6 februari 2023 @ 14:11:
De datafeed is ingelezen en voor zover ik weet moet product[0] gewoon bestaan.
Dat is toch in 1 seconde te controleren?
Check de XML die je hebt, en var_dump($xml->product[0]) eens om te beginnen?

[ Voor 5% gewijzigd door RobIII op 06-02-2023 14:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Je krijgt inderdaad geen foutmelding op regel 9, want je probeert gewoon "iets wat niets is" te printen en dat kan gewoon. Op regels 10 en 11 probeer je iets uit dat niets te halen, en dat kan dan weer niet. Probeer het eens met var_dump() in plaats van echo. Dus
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo "test<br />\n";

echo "product0:<br />\n";
var_dump($xml->product[0]);

echo "<br />ns2.name: <br />\n";
$titel=$xml->product[0]->{"ns2:name"};
var_dump($titel);

echo "<br />omschrijving:<br />\n";
$omschrijving=$xml->product[0]->{"ns2:description"};
var_dump($omschrijving);

echo '<br />test klaar';

Ik heb wat BR en newlines toegevoegd om het leesbaarder te krijgen waarin je dan ook kijkt.

Dat de datafeed eerder gewerkt heeft kan prima kloppen, maar jij lijkt te werken onder de aanname dat de enige verandering is het toevoegen van "ns2:" aan een paar tags, terwijl ik denk dat er qua structuur meer veranderd is waardoor de rest van je code ook niet meer werkt.

[ Voor 29% gewijzigd door DataGhost op 06-02-2023 14:22 ]


Acties:
  • 0 Henk 'm!

  • HappyHug
  • Registratie: December 2007
  • Laatst online: 10-02-2023
Ik heb die regels op regel 8 t/m 21 gezet en krijg nu:
test<br />
product0:<br />
NULL
<br />ns2.name: <br />
PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 14 NULL <br />omschrijving:<br /> PHP Notice: Trying to get property of non-object in /home/younk/domains/alledagdeals.nl/public_html/admin/cronjobs/tradedoubler-velden.php on line 18 NULL <br />test klaarPHP

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Nu online

DataGhost

iPL dev

Precies, dus $xml->product[0] is NULL, en dat is dus een non-object zonder properties. Het is helemaal niets. Rest nu voor je uit te zoeken wat het verschil precies is waardoor dat nu NULL is en in de oude feed niet. Dus ik zou nog eens goed kijken naar de voorbeeld-XML die ik had geplaatst en die vergelijken met de voorbeeld-XML uit je comment hier. Daar zitten meer verschillen tussen dan alleen "ns2:".
Pagina: 1