Avatar billede koonz Nybegynder
04. oktober 2012 - 15:03 Der er 17 kommentarer og
1 løsning

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 :-)
Avatar billede koonz Nybegynder
04. oktober 2012 - 15:10 #1
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>
Avatar billede koonz Nybegynder
04. oktober 2012 - 15:12 #2
Haha

Glem min edit, det er naturligvis den første der er rigtig...
Avatar billede olebole Juniormester
04. oktober 2012 - 16:41 #3
<ole>

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

/mvh
</bole>
Avatar billede olebole Juniormester
04. oktober 2012 - 16:45 #4
- 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)
Avatar billede jokkejensen Novice
04. oktober 2012 - 17:25 #5
å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.
Avatar billede koonz Nybegynder
04. oktober 2012 - 17:38 #6
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" }
]
}
Avatar billede olebole Juniormester
04. oktober 2012 - 18:20 #7
#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)
Avatar billede koonz Nybegynder
04. oktober 2012 - 18:43 #8
#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>
Avatar billede koonz Nybegynder
04. oktober 2012 - 19:00 #9
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 );
    }
}
?>
Avatar billede olebole Juniormester
04. oktober 2012 - 19:18 #10
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/rss/all');
print $sJson;
Avatar billede koonz Nybegynder
04. oktober 2012 - 19:23 #11
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....
Avatar billede olebole Juniormester
04. oktober 2012 - 19:49 #12
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
Avatar billede koonz Nybegynder
04. oktober 2012 - 19:57 #13
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;
}
?>
Avatar billede koonz Nybegynder
04. oktober 2012 - 20:18 #14
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');
}
?>
Avatar billede jokkejensen Novice
06. oktober 2012 - 08:02 #15
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
Avatar billede koonz Nybegynder
06. oktober 2012 - 09:30 #16
#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 ?
Avatar billede olebole Juniormester
06. oktober 2012 - 13:20 #17
*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  =)
Avatar billede koonz Nybegynder
04. november 2012 - 17:18 #18
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester