[PHP] XML bestimmtes unterattribut ausgeben

Dieses Thema im Forum "Webentwicklung" wurde erstellt von newcomer2k6, 26. März 2008 .

Schlagworte:
  1. 26. März 2008
    XML bestimmtes unterattribut ausgeben

    Hallo,

    das ist mein XML File:


    Code:
    <characterInfo>
     <character name="TESTNAME">
    </characterInfo>
    <characterTab>
     <items>
     <item durability="60" slot="0"/>
     <item durability="0" slot="1"/>
     <item durability="60" slot="21"/>
     <item durability="99" slot="4"/>
     <item durability="30" slot="5"/>
     </items>
    </characterTab>
    
    So, nun will ich mir zum Beispiel das Item mit der Slot nummer 21 haben. Das ist mein PHP Code:

    PHP:
    $char  simplexml_load_file ( "XML DATEI" );
    //Name ausgeben
     
    echo  $char -> characterInfo -> character [ 'name' ]; 


    //Hier soll Slot 21 hin
     
    echo  $char -> characterTab -> items -> item ??????????? 

    so, nun wie gehts weiter? hab was von Xpath gelesen, aber das sieht sehr umständlich aus. Gibt es da nicht sowas wie SQL ^^ Select Item from........ =)


    Gruß
     
  2. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    ich denke du musst wohl oder übel mit foreach() deine items durchgehen und gucken, welches davon das entsprechende attribut hat
    zur performance solltest du bei erfolg mit break; die schleife abbrechen
     
  3. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    ok, das wäre auch eine möglichkeit. ich werds mal probieren. Für weitere möglichkeiten bin ich immer offen
     
  4. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    PHP:
    $dom  = new  DOMDocument ( '1.0' 'ISO-8859-1' );
    $dom -> loadXML ( 'der_inhalt_deiner_xml_datei' );
    $items  $dom -> getElementsByTagName ( 'items' );

    $neededItem  null ;
    for(
    $i  0 $o  count ( $items -> item ( 0 )-> childNodes );  $i  $o $i ++) {
        
    $curItem  $items -> item ( 0 )-> childNodes [ $i ];
        if(
    false  !== ( $curItem -> getAttributeNode ( 'slot' ) ==  21 )) {
            
    $neededItem  $curItem ;
            break;
        }
    }

    if(
    $neededItem  !==  null ) print  'node gefunden!' ;
    else print 
    'node mit attribut "slot=21" nicht vorhanden!' ;
    wenn ich mich ned irre sollte das klappen
     
  5. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    Nabend, dabei könnte dir xPath helfen, einfach mal hier schauen

    XPath – Wikipedia

    und dir z.B. dazu mal die vorgeschlagenen Methoden auf PHP: Manual Quick Reference nachrecherchieren.
     
  6. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    Vielleicht etwas Offtopic aber: Das XML-Dokument ist nicht mal valide. Meines Wissens braucht man in jedem XML-Dokument einen Root-Tag der das ganze Dokument umschliesst:
    HTML:
    <root-tag-oder-wie-auch-immer>
     <bli>bar</bli>
     <bla />
     <blub>
     <unterblub id="1">foo</unterblub>
     <unterblub id="2">FOOBAR!!!</unterblub>
     </blub>
    </root-tag-oder-wie-auch-immer>
    So long wirednaTure
     
  7. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    Weil es vielleicht nur ein Ausschnitt des Dokuments mit Wurzel "Character" war ....
     
  8. 26. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    also das ganze wollte ich nicht posten hier, weil das ein bischen viel ist. Es handelt sich um ein Charakter XML von World of Warcraft. Das will ich auslesen.

    hier mal ein Charakter, der eine niedrige ausrüstung hat:

    Code:
    <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/layout/character-sheet.xsl"?><page globalSearch="1" lang="de_de" requestUrl="/character-sheet.xml">
     <characterInfo>
     <character battleGroup="Blutdurst" charUrl="r=Kel%27Thuzad&amp;n=Lolomatik" class="Krieger" classId="1" faction="Allianz" factionId="0" gender="M�nnlich" genderId="0" guildName="Brüder der Alianz" guildUrl="r=Kel%27Thuzad&amp;n=Br%C3%BCder+der+Alianz&amp;p=1" lastModified="29. Mai 2007" level="11" name="Lolomatik" prefix="" race="Zwerg" raceId="3" realm="Kel'Thuzad" suffix=""/>
     <characterTab>
     <talentSpec treeOne="0" treeThree="1" treeTwo="1"/>
     <buffs/>
     <debuffs/>
     <pvp>
     <lifetimehonorablekills value="0"/>
     <arenacurrency value="0"/>
     </pvp>
     <professions/>
     <title value=""/>
     <knownTitles/>
     <characterBars>
     <health effective="280"/>
     <secondBar casting="-1" effective="100" notCasting="-1" perFive="-1" type="r"/>
     </characterBars>
     <baseStats>
     <strength attack="54" base="37" block="1" effective="37"/>
     <agility armor="46" attack="-1" base="23" critHitPercent="5.40" effective="23"/>
     <stamina base="36" effective="36" health="180" petBonus="-1"/>
     <intellect base="20" critHitPercent="-1.00" effective="20" mana="-1" petBonus="-1"/>
     <spirit base="22" effective="22" healthRegen="7" manaRegen="-1"/>
     <armor base="332" effective="332" percent="19.92" petBonus="-1"/>
     </baseStats>
     <resistances>
     <arcane petBonus="-1" value="0"/>
     <fire petBonus="-1" value="0"/>
     <frost petBonus="-1" value="10"/>
     <holy petBonus="-1" value="0"/>
     <nature petBonus="-1" value="0"/>
     <shadow petBonus="-1" value="0"/>
     </resistances>
     <melee>
     <mainHandDamage dps="9.5" max="28" min="22" percent="0" speed="2.60"/>
     <offHandDamage dps="0.0" max="0" min="0" percent="0" speed="2.00"/>
     <mainHandSpeed hastePercent="0.00" hasteRating="0" value="2.60"/>
     <offHandSpeed hastePercent="0.00" hasteRating="0" value="2.00"/>
     <power base="87" effective="87" increasedDps="6.0"/>
     <hitRating increasedHitPercent="0.00" value="0"/>
     <critChance percent="6.20" plusPercent="0.00" rating="0"/>
     <expertise additional="0" percent="0.00" rating="0" value="0"/>
     </melee>
     <ranged>
     <weaponSkill rating="0" value="0"/>
     <damage dps="0.0" max="6" min="5" percent="0" speed="0.00"/>
     <speed hastePercent="0.00" hasteRating="0" value="0.00"/>
     <power base="24" effective="24" increasedDps="1.0" petAttack="-1.00" petSpell="-1.00"/>
     <hitRating increasedHitPercent="0.00" value="0"/>
     <critChance percent="4.24" plusPercent="0.00" rating="0"/>
     </ranged>
     <spell>
     <bonusDamage>
     <arcane value="0"/>
     <fire value="0"/>
     <frost value="0"/>
     <holy value="0"/>
     <nature value="0"/>
     <shadow value="0"/>
     <petBonus attack="-1" damage="-1" fromType=""/>
     </bonusDamage>
     <bonusHealing value="0"/>
     <hitRating increasedHitPercent="0.00" value="0"/>
     <critChance rating="0">
     <arcane percent="0.00"/>
     <fire percent="0.00"/>
     <frost percent="0.00"/>
     <holy percent="0.00"/>
     <nature percent="0.00"/>
     <shadow percent="0.00"/>
     </critChance>
     <penetration value="0"/>
     <manaRegen casting="0.00" notCasting="0.00"/>
     </spell>
     <defenses>
     <armor base="332" effective="332" percent="19.92" petBonus="-1"/>
     <defense decreasePercent="0.00" increasePercent="0.00" plusDefense="0" rating="0" value="54.00"/>
     <dodge increasePercent="0.00" percent="4.33" rating="0"/>
     <parry increasePercent="0.00" percent="4.96" rating="0"/>
     <block increasePercent="0.00" percent="4.96" rating="0"/>
     <resilience damagePercent="0.00" hitPercent="0.00" value="0.00"/>
     </defenses>
     <items>
     <item durability="0" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_shirt_05" id="38" maxDurability="0" permanentenchant="0" randomPropertiesId="0" seed="0" slot="3"/>
     <item durability="8" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_chest_chain" id="2656" maxDurability="55" permanentenchant="0" randomPropertiesId="0" seed="-2050420520" slot="4"/>
     <item durability="7" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_belt_06" id="2172" maxDurability="18" permanentenchant="0" randomPropertiesId="0" seed="62338249" slot="5"/>
     <item durability="1" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_pants_03" id="2654" maxDurability="35" permanentenchant="0" randomPropertiesId="0" seed="894519314" slot="6"/>
     <item durability="9" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_boots_01" id="2650" maxDurability="25" permanentenchant="0" randomPropertiesId="0" seed="-1618076648" slot="7"/>
     <item durability="0" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_bracer_03" id="2651" maxDurability="18" permanentenchant="0" randomPropertiesId="0" seed="805316009" slot="8"/>
     <item durability="13" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_gauntlets_04" id="2645" maxDurability="20" permanentenchant="0" randomPropertiesId="0" seed="-1994568836" slot="9"/>
     <item durability="0" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_misc_cape_02" id="2652" maxDurability="0" permanentenchant="0" randomPropertiesId="0" seed="962425412" slot="14"/>
     <item durability="8" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_axe_04" id="1011" maxDurability="35" permanentenchant="0" randomPropertiesId="0" seed="1532094652" slot="15"/>
     <item durability="32" gem0Id="0" gem1Id="0" gem2Id="0" icon="inv_shield_09" id="2212" maxDurability="35" permanentenchant="0" randomPropertiesId="0" seed="1822983566" slot="16"/>
     </items>
     </characterTab>
     </characterInfo>
    </page>
    
    Ich werde es morgen nochmal ausprobieren. Danke euch. Den Thread lass ich mal auf bis morgen.
     
  9. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    So, ich bin weiter gekommen. Habs per Xpath jetzt geschaft, so siehts aus:


    PHP:
    $char  simplexml_load_file ( "XML DATEI" );

    for(
    $i  0 $i  18 $i ++) {
        
    $xpath  "//characterInfo/characterTab/items/item[@slot='" . $i . "']" ;
        if (!
    $item  $char -> xpath ( $xpath )) {
            echo 
    "Fehler beim Auslesen des Items!" ;
        } else {
            foreach(
    $item [ 0 ]-> attributes () as  $attribut  =>  $value ) {
                
    $items [ $i ][ $attribut ]=  $value ;
                echo 
    $attribut  ' = '  $value  "<br />\n" ;
            }  
        }
        unset(
    $xpath ); 
    }
    Soweit so gut! Nun habe ich aber ein kleines Problem. in der foreach Schleife schein $value ein Objekt zu sein und das wird dann in das Array $items gepackt. Nun weiß ich aber nicht genau, wie man das ausliest. Hier mal die ausgabe von $items:

    Code:
    Array
    (
     [0] => Array \\ 0 = Slot ID
     (
     [durability] => SimpleXMLElement Object
     (
     [0] => 56
     )
    
     [gem0Id] => SimpleXMLElement Object
     (
     [0] => 28556
     )
    
     [gem1Id] => SimpleXMLElement Object
     (
     [0] => 23097
     )
    
     [gem2Id] => SimpleXMLElement Object
     (
     [0] => 0
     )
    
     [icon] => SimpleXMLElement Object
     (
     [0] => inv_helmet_09
     )
    
     [id] => SimpleXMLElement Object
     (
     [0] => 28331
     )
    
     [maxDurability] => SimpleXMLElement Object
     (
     [0] => 85
     )
    
     [permanentenchant] => SimpleXMLElement Object
     (
     [0] => 2841
     )
    
     [randomPropertiesId] => SimpleXMLElement Object
     (
     [0] => 0
     )
    
     [seed] => SimpleXMLElement Object
     (
     [0] => 0
     )
    
     [slot] => SimpleXMLElement Object
     (
     [0] => 0
     )
    
     )
    )
    Das, finde ich, sieht doch schon besser aus. Jetzt ist nur noch das SimpleXMLElement Object im Weg. Wie liest man das aus? Wenn ich bei $value noch [0] anhänge gehts auch nicht. Aber eigentlich müsste ich ja per -> auf den Inhalt zugreifen können, aber was soll ich für ein Namen angeben??? $value->???

    Wer es jetzt schafft das zu lösen bekommen 1.000.000 Punkte
     
  10. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    Ich bin mir nicht sicher aber
    PHP:
    echo  $array [ 0 ][ 'durability' ][ 0 ]
    ... könnte es so sein? Einfach per Array zugriff?
     
  11. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben


    ne, das wars leider nicht :/
     
  12. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    mit xpath müsste das so gehen: //item[@slot="21"]
     
  13. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    PHP:
    $xpath  "//characterInfo/characterTab/items/item[@slot='21']" ;
    ist genau das gleiche wie
    PHP:
    $xpath  "//item[@slot='21']" ;
    Gerade festgestellt

    Aber das hat ja jetzt funktioniert, Murdoc. Ich habe nur das Problem, das in meinem eigentlichen Slot Array noch ein unter array ist wo das drin steht:

    Code:
    SimpleXMLElement Object
     (
     [0] => 23097
     )
     
  14. 27. März 2008
    AW: XML bestimmtes unterattribut ausgeben

    lass dir doch mal alle eigenschaften des objekts mittels print_r ausgeben (das oben sieht mir nach var_dump aus). mit print_r hast du wesentlich mehr informationen.

    auch interessant ist get_class_methods(simpleXMLElement $obj)

    dann findest du dich mit sicherheit schneller zurecht.
     
  15. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.