2009-07-16 4 views
2

Hey Leute, ich möchte etwas XML analysieren, aber ich weiß nicht, wie ich die gleichen Tags aus 1 Element bekommen kann.SimpleXML mehr Tags in 1 Element

Ich möchte dies analysieren:

<profile> 
    <name>john</name> 
    <lang>english</lang> 
    <lang>dutch</lang> 
</profile> 

Deshalb möchte ich die Sprache analysieren, die John spricht. wie kann ich das machen ?

Antwort

2

Sie können eine foreach Schleife über die Elementknoten ausgeführt, nachdem Sie es in mit SimpleXML wie so gezogen haben:

$xml_profiles = simplexml_load_file($file_profiles); 

foreach($xml_profiles->profile as $profile) 
{ //-- first foreach pulls out each profile node 

    foreach($profile->lang as $lang_spoken) 
    { //-- will pull out each lang node into a variable called $lang_spoken 
     echo $lang_spoken; 
    } 
} 

Dies den Vorteil in der Lage, eine beliebige Anzahl von lang Elemente zu handhaben hat Sie haben oder haben nicht für jedes Profilelement.

2
$profile->lang[0] 
$profile->lang[1] 
1

Denken Sie an doppelte XML-Knoten, die sich wie ein Array verhalten.

Wie andere haben darauf hingewiesen, können Sie die Knoten Kind mit Klammer-Syntax zugreifen

myXML->childNode[childIndex] 

Als Randnotiz ist dies, wie RSS-Feeds Arbeit. Sie werden mehrere

<item> 
</item> 

<item> 
</item> 

<item> 
</item> 

Tags innerhalb eines Tags von RSS XML. RSS-Leser behandeln dieses Problem jeden Tag, indem sie die Liste als ein Array von Elementen behandeln.

Welche können überschliffen werden.

0

Sie können auch XPath verwenden, um eine Reihe von spezifischen Elementen wie

$xProfile = simplexml_load_string("<profile>...</profile>"); 
$sName = 'john'; 
$aLang = $xProfile->xpath("/profile/name[text()='".$sName."']/lang"); 
// Now $aLang will be an array of lang *nodes* (2 for John). Because they 
// are nodes you can still do SimpleXML "stuff" with them i.e. 
// $aLang[0]->attributes(); --which is an empty object 
// or even 

$sPerson = (string)$aLang[0]->xpath('preceding-sibling::name'); 
// of course you already know this... but this was just to show what you can do 
// with the SimpleXml node. 
zu sammeln