Reputation: 41
This is what I've tried so far and it gives me a bunch of stuff I don't want (see bottom for browser output):
// transform to Simple XML
$xml = new SimpleXMLElement($results);
// find category names
$xml = $xml->xpath('params/param/value/array/data/value/struct/member/value/string');
print_r($xml);
This is the XML, I need to get all the categoryName nodes:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><struct>
<member><name>categoryId</name><value><string>7</string></value></member>
<member><name>parentId</name><value><string>0</string></value></member>
<member><name>description</name><value><string>@MyCat000egory</string></value></member>
<member><name>categoryDescription</name><value><string></string></value></member>
<member><name>categoryName</name><value><string>@MyCat000egory</string></value></member>
<member><name>htmlUrl</name><value><string>http://en.webacceleration.net/?cat=7</string></value></member>
<member><name>rssUrl</name><value><string>http://en.webacceleration.net/?feed=rss2&amp;cat=7</string></value></member>
</struct></value>
<value><struct>
<member><name>categoryId</name><value><string>6</string></value></member>
<member><name>parentId</name><value><string>0</string></value></member>
<member><name>description</name><value><string>this is the category</string></value></member>
<member><name>categoryDescription</name><value><string></string></value></member>
<member><name>categoryName</name><value><string>this is the category</string></value></member>
<member><name>htmlUrl</name><value><string>http://en.webacceleration.net/?cat=6</string> </value></member>
<member><name>rssUrl</name><value><string>http://en.webacceleration.net/?feed=rss2&amp;cat=6</string></value></member>
</struct></value>
<value><struct>
<member><name>categoryId</name><value><string>1</string></value></member>
<member><name>parentId</name><value><string>0</string></value></member>
<member><name>description</name><value><string>Uncategorized</string></value></member>
<member><name>categoryDescription</name><value><string></string></value></member>
<member><name>categoryName</name><value><string>Uncategorized</string></value></member>
<member><name>htmlUrl</name><value><string>http://en.webacceleration.net/?cat=1</string></value></member>
<member><name>rssUrl</name><value><string>http://en.webacceleration.net/?feed=rss2&amp;cat=1</string></value></member>
</struct></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
And this is the browser output:
Array ( [0] => SimpleXMLElement Object ( [0] => 7 ) [1] => SimpleXMLElement Object ( [0] => 0 ) [2] => SimpleXMLElement Object ( [0] => @MyCat000egory ) [3] => SimpleXMLElement Object ( ) [4] => SimpleXMLElement Object ( [0] => @MyCat000egory ) [5] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?cat=7 ) [6] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?feed=rss2&cat=7 ) [7] => SimpleXMLElement Object ( [0] => 6 ) [8] => SimpleXMLElement Object ( [0] => 0 ) [9] => SimpleXMLElement Object ( [0] => this is the category ) [10] => SimpleXMLElement Object ( ) [11] => SimpleXMLElement Object ( [0] => this is the category ) [12] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?cat=6 ) [13] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?feed=rss2&cat=6 ) [14] => SimpleXMLElement Object ( [0] => 1 ) [15] => SimpleXMLElement Object ( [0] => 0 ) [16] => SimpleXMLElement Object ( [0] => Uncategorized ) [17] => SimpleXMLElement Object ( ) [18] => SimpleXMLElement Object ( [0] => Uncategorized ) [19] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?cat=1 ) [20] => SimpleXMLElement Object ( [0] => http://en.webacceleration.net/?feed=rss2&cat=1 ) )
Upvotes: 1
Views: 139
Reputation: 270599
$categories = $xml->xpath('//name[text()="categoryName"]/../value/string');
Use text()="categoryName"
to target the <name>
and /../
to retrieve its sibling node <value>
.
Full breakdown:
//name[text()="categoryName"]
All <name>
nodes having text value of "categoryName"/../
Parent node of the previous match/value/string
<string>
node that is a child of <value>
of the parent matched by /../
.
var_dump($categories);
array(3) {
[0]=>
object(SimpleXMLElement)#5 (1) {
[0]=>
string(14) "@MyCat000egory"
}
[1]=>
object(SimpleXMLElement)#6 (1) {
[0]=>
string(20) "this is the category"
}
[2]=>
object(SimpleXMLElement)#7 (1) {
[0]=>
string(13) "Uncategorized"
}
}
Upvotes: 1
Reputation: 117314
Use instead of simply member
this: member[name="categoryName"]
$xml = $xml->xpath('params/param/value/array/data/value/struct/member[name="categoryName"]/value/string');
Upvotes: 1