Oprettet tor. d. 04. oktober 2012 kl. 15:03:58

koonz
koonz (22.930 point. Point ude: 910)

XML til JSON

Jeg er lidt på udebane, da PHP og XML ikke er min stærke side.
Firmaet jeg arbejder for, har en online XML fil der beskriver alle vores produkter, den at lavet efter nedenstående mønster

<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt1]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[10]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt2]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[20]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt3]]</PVAL>
<PROP NAME="Value">
<PVAL><!CDATA[30]]</PVAL>
</RECORD>

Jeg skal ha lavet et PHP script der ved en forspørgsel henter alle props fra et produkt, og putter i et JSON Array.

www.produkter.com/produkt.php?Produkt2

Jeg kan ikke rigtig komme igang - så hjælp udbedes :-)

Skrevet tor. d. 04. oktober 2012 kl. 15:10:00| #1

koonz
koonz (22.930 point)
edit...

<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt1]]</PVAL>
<PROP value="Value">
<PVAL><!CDATA[10]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt2]]</PVAL>
<PROP value="Value">
<PVAL><!CDATA[20]]</PVAL>
</RECORD>
<RECORD>
<PROP NAME="Product">
<PVAL><!CDATA[Produkt3]]</PVAL>
<PROP value="Value">
<PVAL><!CDATA[30]]</PVAL>
</RECORD>

Skrevet tor. d. 04. oktober 2012 kl. 15:12:04| #2

koonz
koonz (22.930 point)
Haha

Glem min edit, det er naturligvis den første der er rigtig...

Skrevet tor. d. 04. oktober 2012 kl. 16:41:08| #3

olebole
olebole (216.873 point)
<ole>

Hvad er det, du skal have returneret? Et array eller en JSON-streng?

/mvh
</bole>

Skrevet tor. d. 04. oktober 2012 kl. 16:45:11| #4

olebole
olebole (216.873 point)
- og så har du i øvrigt åbne tråde, som er helt op til 11 år gamle. Det ville nok være hensigtsmæssigt at forholde sig konstruktivt til dem  *o)

Skrevet tor. d. 04. oktober 2012 kl. 17:25:04| #5

jokkejensen
jokkejensen (40.259 point)
åndsvagt overhead at konvertere xml til json, fordi du ikke har kompetence eller gider sætte dig ind i php/xml/xpath eller hvordan man nu arbejder med xml i php.

Skrevet tor. d. 04. oktober 2012 kl. 17:38:48| #6

koonz
koonz (22.930 point)
JokkeJensen
Nu ved du jo ikke hvad jeg skal bruge output til og hvor input (XML) kommer fra !! - det kunne være jeg var begrænset - forhold dig til spørgsmålet i stedet for at spille klogeåge !!

Ja egentlig havner der jo kun én string i mit array, men min modtager gør at jeg skal placere det i et array.

Noget i stil med

{
"Product": [
{ "Name":"Product1" , "Value":"10" }
]
}

Skrevet tor. d. 04. oktober 2012 kl. 18:20:41| #7

olebole
olebole (216.873 point)
#5: Det kunne jo være, at outputtet skal bruges til et allerede bestående system, som bygger på JSON. I den situation ville det da være temmelig ubegavet at lave hele systemet om - uagtet dine tvivlsomme diagnostiske betragtninger  *o)

Skrevet tor. d. 04. oktober 2012 kl. 18:43:30| #8

koonz
koonz (22.930 point)
#7 Præcis min pointe....

Der er måske noget der tyder på jeg må i dialog med XML filens forfatter, eller have den kørt gennem en "Converter". Efter jeg har læst diverse materiale har jeg forstået at designet af XML filen er ret uheldigt...

Jeg havde jo drømt om at jeg kunne lave en "SELECT" ligesom på en database....
Som jeg har forstået det bruges XPath til dette, men XML strukturen i min fil gør det svært.
Jeg har opstillet en struktur nedenstående der viser det bedre visuelt.

Jeg bør måske nævne at xml filen fylder 100 mb.


<?xml version='1.0'?>
<RECORDS>
    <RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt1]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[10]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>
<RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt2]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[20]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>
<RECORD>
    <PROP NAME="Product">
        <PVAL><![CDATA[Produkt3]]></PVAL>
    </PROP>
    <PROP NAME="Value">
        <PVAL><![CDATA[30]]></PVAL>
    </PROP>
    <PROP NAME="Status">
        <PVAL><![CDATA[Active]]></PVAL>
    </PROP>
</RECORD>

Skrevet tor. d. 04. oktober 2012 kl. 19:00:49| #9

koonz
koonz (22.930 point)
Jeg har lavet ovenstående som en test fil med xml og lavet nedenstående PHP script, men det virker ikke rigtigt...

<?php
if (file_exists( 'test.xml' ))
{
    $xml = simplexml_load_file('test.xml');
} else {
    exit('Error file test.xml.');
}

foreach ($xml->RECORD as $record)
{
    if ($record->PROP[0]->PVAL == 'Produkt1')
    {
        echo json_encode( $record );
    }
}
?>

Skrevet tor. d. 04. oktober 2012 kl. 19:18:00| #10

olebole
olebole (216.873 point)
Du har under alle omstændigheder en udfordring med størrelsen. 100MB XML burde nok ligge i en database i stedet for  =)

Det er ikke utænkeligt, du løber ind i timeouts - og resultatet bør nok caches på passende måde, så filen kan kaldes så lidt som muligt. Prøv:

function xmlUrl2Json($sUrl) {
    $sXml = file_get_contents($sUrl);
    $oXml = simplexml_load_string($sXml);
    return json_encode(new SimpleXMLElement($oXml->asXML(), LIBXML_NOCDATA));
}

$sJson = xmlUrl2Json('http://www.computerworld.dk/ (...));
print $sJson;

Skrevet tor. d. 04. oktober 2012 kl. 19:23:30| #11

koonz
koonz (22.930 point)
Hej

Ja...Jeg tror det er en no go, med den XML fil, jeg må i dialog med forfatteren.

Jeg ved ikke lige helt hvordan en database kunne se ud. XML filen dækker vores produkter og ikke alle produkter har samme properties....

Skrevet tor. d. 04. oktober 2012 kl. 19:49:30| #12

olebole
olebole (216.873 point)
Du kan lægge produkter i en tabel for sig selv - og deres properties i en anden tabel:

Table Props
prod_id | prop_name | prop_value

Table Products
prod_id | prod_name | prod_price

- eller du kan vælge en model med en tabel til produkter - en tabel til properties - samt en tabel, der knytter de to sammen

Skrevet tor. d. 04. oktober 2012 kl. 19:57:13| #13

koonz
koonz (22.930 point)
Ja, det bliver noget i den dur - hvis jeg kan få fat i der hvor data kommer fra.

Alternativt er at lave en tool der omsætter den fil jeg har og indsætter i en SQL.
Problemet er nok at jeg ikke kan loade hele filen ind, jeg har prøvet med scriptet under. Det fungerer på min lille test.xml fil, men på den store 100 mb. fungerer det ikke.

Det må være noget med at steppe sig gennem filen uden at hente det hele ind i mem først, hvordan jeg så lige gør det....Der må være et alternativ til SimpleXML ? ;-)



<?php

$xml = simplexml_load_file( 'test.xml' );

foreach ($xml->RECORD as $record)
{
    $strvalue = $record->PROP[0]->PVAL;
    echo $strvalue;
}
?>

Skrevet tor. d. 04. oktober 2012 kl. 20:18:39| #14

koonz
koonz (22.930 point)
Så tror jeg sgu jeg har den :-)

<?php
$z = new XMLReader;
$z->open('products.xml');

$doc = new DOMDocument;

// move to the first <product /> node
while ($z->read() && $z->name !== 'RECORD');

// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'RECORD')
{

    $node = simplexml_import_dom($doc->importNode($z->expand(), true));


    $strvalue = $node->PROP[6]->PVAL;
    echo $strvalue."<p>" ;

    // go to next <product />
    $z->next('RECORD');
}
?>

Skrevet lør. d. 06. oktober 2012 kl. 08:02:17| #15

jokkejensen
jokkejensen (40.259 point)
Sån erfarinsmæssigt er det sku ikke altid samtlige spørgsmål sidder i lige skabet. Og hvis man ikke må komme med andre løsningsforslag.

Især hvis man mener -> xml -> database -> json er tåbeligt. Et enkelt json udtræk, vil tvinge den til at opdatere database, hente json. Med mindre produkterne ikke opdatere sig.

xml -> php/xslt -> json LIVE !!

/J

Skrevet lør. d. 06. oktober 2012 kl. 09:30:28| #16

koonz
koonz (22.930 point)
#15 Men du kom jo ikke med noget løsningsforslag. Du spillede bare klog, og tilføjede ikke noget konstruktivt.

Jeg er helt åben overfor at det måske ikke er verdens bedste løsning, men det er nu de rammer jeg har stillet til rådighed.

1. XML filen kommer fra en kilde jeg ikke har kontrol over og filen har et uheldigt format...
2. Modtageren SKAL have det som JSON i et array.

Konklusionen bliver et værktøj der udtrækker produkterne fra XML filen og placerer dem i en database i stedet. Databasen skal så opdateres - evt. en gang om måneden, men når først værktøjet er på plads, så kører det nemt.
2. skridt må være at få kilden til at placere det i en database fra starten. Jeg mener helt klart det er den bedste løsning, når man ser på mængden af data (100 mb xml fil).

#15 Hvis du har noget mere konstruktivt baseret på det XML layout jeg har at arbejde med, så kom da med det !
J
OleBole - smider du et svar, så jeg kan lukke ?

Skrevet lør. d. 06. oktober 2012 kl. 13:20:15| #17

olebole
olebole (216.873 point)
*ROTFLMAO* Nu ikke så mismodig, Jokke. Der er ingen af os, som kan forlange, at de andre brugere ikke synes, at vores forslag er tåbelige. Al erfaring siger, at netop du burde være den allerførste til at vide det. Somme tider er du simpelhen selve definitionen på en diva!  :D

@koonz: Ellers tak, jeg samler ikke point. Hvis du mener, jokkejensen har bidraget til en løsningen, kan du bede ham om at lægge et svar. Ellers lægger du selv et og accepterer det, så tråden lukkes  =)

Skrevet søn. d. 04. november 2012 kl. 17:18:32| #18


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Hjælp ønskes til to løkker, der driller...

Oprettet den 18. juni 2013 kl. 15.28
allandk giver 30 point for svar | Giv et svar »

Faa xml out put som en variable

Oprettet den 18. juni 2013 kl. 14.08
techboy992 giver 30 point for svar | Giv et svar »

PHP Programmør søges!

Oprettet den 18. juni 2013 kl. 00.50
Japsen giver 0 point for svar | Giv et svar »







IT Kurser
Samarbejdspartnere

Udgiver · © 2013 Computerworld A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger