Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 1039
Hei.

Jeg har et XML-dokument som ser noenlunde slik ut:

Kode

<zitem:humdata>
    <zitem:field name="obj1" value="1"/>
    <zitem:field name="obj2" value="2"/>
    <zitem:field name="obj3" value="3"/>
    <zitem:field name="obj4" value="4"/>
    <zitem:field name="parent">
        <zitem:field name="child1" value="C1"/>
        <zitem:field name="child2" value="C2"/>
        <zitem:field name="child3" value="C3"/>
    </zitem:field>
</zitem:humdata>
Dette dokumentet blir hentet med cURL, og lagt inn i variablen $rawdata.

Jeg får hentet ut verdien av radene som ikke er underlagt en parent ved hjelp av følgende:

Kode

$xmlElement = new SimpleXMLElement($rawdata);
$namespace = $xmlElement->getNamespaces(true);

foreach ($humdata->children($namespace['zitem'])->field as $field) {
    if ($field->attributes()->name == 'obj1') {
        $objekt1_verdi = $field->attributes()->value;
    }
}

Det jeg sliter med er å få hentet ut verdiene fra childX-radene som befinner seg under parent-raden.

Jeg har slitt med dette i hele dag, men XML og cURL er et relativt nytt område for meg.



-----------



Jeg har forstått det slik at dersom XML-dokumentet hadde vært satt opp slik:

Kode

<zitem:humdata>
    <zitem:field name="obj1" value="1"/>
    <zitem:field name="obj2" value="2"/>
    <zitem:field name="obj3" value="3"/>
    <zitem:field name="obj4" value="4"/>
    <zitem:moder name="parent">
        <zitem:field name="child1" value="C1"/>
        <zitem:field name="child2" value="C2"/>
        <zitem:field name="child3" value="C3"/>
    </zitem:moder>
</zitem:humdata>
Så kunne jeg hentet ut childX-verdiene med følgende:

Kode

$xmlElement = new SimpleXMLElement($rawdata);
$namespace = $xmlElement->getNamespaces(true);

foreach ($humdata->children($namespace['zitem'])->field as $field) {
    if ($field->attributes()->name == 'obj1') {
        $objekt1_verdi = $field->attributes()->value;
    }

    foreach ($field->children($namespace['zitem'])->moder as $barn) {
        if ($barn->attributes()->name == 'child1') {
            $barn1_verdi = $barn->attributes()->value;
        }
    }
}
Men oppsettet i dette XML-dokumentet er ute av min kontroll.

Er jeg helt på bærtur med det nederste kodeeksempelet, eller er det mulig å få til noe lignende på mitt første kodeeksempel der både parent og child "heter" <zitem:field>?
Nå kjenner ikke jeg PHP-apiet for XML/DOM, men hvis den følger
standard DOM-api kan du vel gjøre noe à la dette:

if ($field->hasChildNodes())
// iterate over $field->children()

Et annet alternativ er å bruke xpath.
Det er ofte enklere å benytte native array enn å parse XML, kanskje prøve denne metoden?

Kode

$xml   = simplexml_load_string( $xmlstring, "SimpleXMLElement", LIBXML_NOCDATA );
$json  = json_encode( $xml );
$array = json_decode( $json, TRUE );
... og se hva du får ut av $array

er usikker på om du trenger alle 3 linjene fra eksemplet over, i prinsippet skal dette funke:

Kode

$arr = simplexml_load_string( $xmlstring, "SimpleXMLElement", LIBXML_NOCDATA );

Kode

print_r( $arr );
Sist endret av nudo; 5. august 2015 kl. 00:57. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Jeg er ikkje så kjent med SimpleXML i PHP, har stortsett brukt DOMDocument. Men jeg google svaret til deg.

Kode

$xmlIterator = new SimpleXMLIterator( $xml );

function iteratorXML ( $iterator )
{
    $data = array ( );

    for( $iterator->rewind(); $iterator->valid(); $iterator->next() ) 
    {
        if($iterator->hasChildren()) 
        {
            if (( $current = $iterator -> current ( )) != NULL )
            {
                $data = iteratorXML ( $current );
            }
        }
        else
        {
             /*  $data = [ Behandle XML dataen ] */
        }
    }

    return $data
}
Denne koden er ikkje prøve kjørt, men dette skal gi deg en ide om hvordan du gjør det. Denne kan forresten lese uendelig mange level med parent/child elementer.