Archief - Multidimensioneel Object naar Array casten.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bram

Legacy Member
Hey all

Ik wou eens met de XML spelen die de WoW Armory voorziet, na wat googlen vond ik al gauw hoe ik de xml moet ophalen en in een simplexml object moet steken. maar nu zit ik met het probleem dat ik dat object graag in een array zou hebben.

Nu heb ik al simpelweg

Code:
$xml = simplexml_load_string($information);

$array = (array) $xml

Maar dat zorgt ervoor dat alleen het eerste niveau een array is, het object bestaat uit verschillende niveaus en het resultaat is dus dat ik een array heb met meer objecten in.

Ik ben al even aan het zoeken maar vind niet direct iets, is er een manier om recursief alle objecten in array's te veranderen?

Mss het waarom even uitleggen: normaal zou ik gewoon werken met $xml->objectnaam->subobject etc, maar verschillende stukken noemen '@attributes'. als ik dan $xml->@attributes wil echo'en, geeft php een "unexpected @" error.

Cyberkef

Legacy Member
Uit het voorbeeldje van op php.net neem ik het volgende aan:

Als je nu een xml file hebt van armory (en nu zuig ik maar wat uit men duim):

HTML:
<armory>
     <char>
          <name>Sieberlock</name>
          <class>Warlock</class>
          <race>Undead</race>
     </char>
     <stats>
          ...
     </stats>
</armory>

Als je dat met $xml = simplexml_load_string($xml_path) leest, kan je dan niet gewoon werken met:

PHP:
$name = $xml->armory->char->name;

Kun je ook gebruiken (en is wat meer array alike):

PHP:
$name = $xml['armory']['char']['name'];

En nu hoop ik dat ik door het late uur geen kanjers van fouten maak :p

*edit* Ja dus, kzie net dat ze er zelf al recursieve xml2array functies voor gemaakt hebben :p

PHP:
function XML2Array ( $xml , $recursive = false )
{
    if ( ! $recursive )
    {
        $array = simplexml_load_string ( $xml ) ;
    }
    else
    {
        $array = $xml ;
    }
   
    $newArray = array () ;
    $array = ( array ) $array ;
    foreach ( $array as $key => $value )
    {
        $value = ( array ) $value ;
        if ( isset ( $value [ 0 ] ) )
        {
            $newArray [ $key ] = trim ( $value [ 0 ] ) ;
        }
        else
        {
            $newArray [ $key ] = XML2Array ( $value , true ) ;
        }
    }
    return $newArray ;

Bram

Legacy Member
mja, daar zit het probleem dus.

dit is de xml:

HTML:
    <characterInfo>
   	  <character battleGroup="Conviction" charUrl="r=Laughing+Skull&amp;n=Gekkerine" class="Priest" classId="5" classUrl="c=Priest" faction="Horde" factionId="1" gender="Female" genderId="1" guildName="Failtrain" guildUrl="r=Laughing+Skull&amp;gn=Failtrain" lastModified="May 23, 2009" level="80" name="Gekkerine" points="1355" prefix="" race="Blood Elf" raceId="10" realm="Laughing Skull" suffix=""/>
    .....
beetje ingekort etc

simplexml_load_string maakt daarvan (gewone print_r):

Code:
SimpleXMLElement Object
(
    [characterInfo] => SimpleXMLElement Object
        (
            [character] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [battleGroup] => Conviction
                            [charUrl] => r=Laughing+Skull&n=Gekkerine
                            [class] => Priest
                            [classId] => 5
                            [classUrl] => c=Priest
                            [faction] => Horde
                            [factionId] => 1
                            [gender] => Female
                            [genderId] => 1
                            [guildName] => Failtrain
                            [guildUrl] => r=Laughing+Skull&gn=Failtrain
                            [lastModified] => May 23, 2009
                            [level] => 80
                            [name] => Gekkerine
                            [points] => 1355
                            [prefix] => 
                            [race] => Blood Elf
                            [raceId] => 10
                            [realm] => Laughing Skull
                            [suffix] => 
                        )

                )

Ge ziet die @ bij attributes? Daardoor kank dus nie $xml->etc->@attributes gebruiken, want daar error hij op. En als ik $xml['characterInfo']['character']['@attributes']['name'] probeer, geeft ie niks. Tenzij ik ondertss scheel kijk en iets mis.


Edit: daar was niets mis mee, want die function die je postte (niet gezien zelf) werkt perfect!

Cyberkef

Legacy Member
Bizar, zou net hetzelfde als jij gedaan hebben... En voor zover ik kan zien, zie ik ook niet direct een fout. Nu, @ is zowiezo toch al een wat gevaarlijk tekentje :p

Mss staat het als ascii code in de arraykey maar toont ie het in je browser als @ ofzo. Soit, hopelijk ben je iets met die recursieve functie :p

KO

Legacy Member
Goh, heb je dat @ al proberen escapen (in de array-manier van werken)?

['\@attributes']

anders kan je de file die je inleest eerst bewerken en "@attributes" veranderen naar "attributes"

Bram

Legacy Member
=[KO]=;11619124 zei:
Goh, heb je dat @ al proberen escapen (in de array-manier van werken)?

['\@attributes']

anders kan je de file die je inleest eerst bewerken en "@attributes" veranderen naar "attributes"

in een array die @ gebruiken (dus $xml['@attributes']) is het probleem niet (enkele quotes worden toch niet geparsed, dus ge kunt er inzetten wat ge wilt), tis maar een probleem als ik $xml->@attributes wil gebruiken. Nu zou ik moeten kunnen escapen.

Juist gemerkt dat die recursieve functie (waarvan ik niets snap) niet recursief genoeg is. Der ontbreken stukken in m'n array :(


Edit: weer zo'n typisch voorbeeld van late night working en het verkeerde googlen. ipv $xml->@attributes->name te gebruiken, moet je $xml->attributes()->name gebruiken. works like a charm.
$xmlObject->characterInfo->character['name'] is nog eenvoudiger.


mss nog een ander vraagje: iemand een idee waarom file_get_contents() de (ik denk javascript) geparsede pagina geeft, ipv van de xml wanneer je
Code:
ini_set("user_agent", "Mozilla/5.0 Gecko/20070219 Firefox/2.0.0.12");
NIET gebruikt. Ik gebruikte eerst file_get_contents en dan simplexml_load_string... simplexml_load_file werkt in een keer, zonder die ini_set...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan