THE PROBLEM
I am using cURL and PHP to retrieve a list of categories from a WordPress site via XML-RPC (wp.getCategories or metaWeblog.getCategories), but I’m having trouble parsing the response, as it seems very complicated.
My code should parse the response and create a simple dropdown menu:
This is not supposed to be actual working code, but how I picture it to work:
$xml = simplexml_load_string($categories);
$select_string = "<select name=\"cats\">";
foreach ($xml as $category) {
$select_string .= "<option value=\"" . $category->value . "\">" . $category->name . "</option>";
}
$select_string .= "</select>";
And the response that I’m trying to parse is (this is what the simplexml_load_string outputs):
SimpleXMLElement Object
(
[param] => SimpleXMLElement Object
(
[value] => SimpleXMLElement Object
(
[array] => SimpleXMLElement Object
(
[data] => SimpleXMLElement Object
(
[value] => Array
(
[0] => SimpleXMLElement Object
(
[struct] => SimpleXMLElement Object
(
[member] => Array
(
[0] => SimpleXMLElement Object
(
[name] => categoryId
[value] => SimpleXMLElement Object
(
[string] => 4
)
)
[1] => SimpleXMLElement Object
(
[name] => parentId
[value] => SimpleXMLElement Object
(
[string] => 0
)
)
[2] => SimpleXMLElement Object
(
[name] => description
[value] => SimpleXMLElement Object
(
[string] => News
)
)
[3] => SimpleXMLElement Object
(
[name] => categoryDescription
[value] => SimpleXMLElement Object
(
[string] => SimpleXMLElement Object
(
)
)
)
[4] => SimpleXMLElement Object
(
[name] => categoryName
[value] => SimpleXMLElement Object
(
[string] => News
)
)
[5] => SimpleXMLElement Object
(
[name] => htmlUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/news/
)
)
[6] => SimpleXMLElement Object
(
[name] => rssUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/news/feed/
)
)
)
)
)
[1] => SimpleXMLElement Object
(
[struct] => SimpleXMLElement Object
(
[member] => Array
(
[0] => SimpleXMLElement Object
(
[name] => categoryId
[value] => SimpleXMLElement Object
(
[string] => 5
)
)
[1] => SimpleXMLElement Object
(
[name] => parentId
[value] => SimpleXMLElement Object
(
[string] => 4
)
)
[2] => SimpleXMLElement Object
(
[name] => description
[value] => SimpleXMLElement Object
(
[string] => Testimonials
)
)
[3] => SimpleXMLElement Object
(
[name] => categoryDescription
[value] => SimpleXMLElement Object
(
[string] => SimpleXMLElement Object
(
)
)
)
[4] => SimpleXMLElement Object
(
[name] => categoryName
[value] => SimpleXMLElement Object
(
[string] => Testimonials
)
)
[5] => SimpleXMLElement Object
(
[name] => htmlUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/news/testimonials/
)
)
[6] => SimpleXMLElement Object
(
[name] => rssUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/news/testimonials/feed/
)
)
)
)
)
[2] => SimpleXMLElement Object
(
[struct] => SimpleXMLElement Object
(
[member] => Array
(
[0] => SimpleXMLElement Object
(
[name] => categoryId
[value] => SimpleXMLElement Object
(
[string] => 1
)
)
[1] => SimpleXMLElement Object
(
[name] => parentId
[value] => SimpleXMLElement Object
(
[string] => 0
)
)
[2] => SimpleXMLElement Object
(
[name] => description
[value] => SimpleXMLElement Object
(
[string] => Uncategorized
)
)
[3] => SimpleXMLElement Object
(
[name] => categoryDescription
[value] => SimpleXMLElement Object
(
[string] => SimpleXMLElement Object
(
)
)
)
[4] => SimpleXMLElement Object
(
[name] => categoryName
[value] => SimpleXMLElement Object
(
[string] => Uncategorized
)
)
[5] => SimpleXMLElement Object
(
[name] => htmlUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/uncategorized/
)
)
[6] => SimpleXMLElement Object
(
[name] => rssUrl
[value] => SimpleXMLElement Object
(
[string] => http://lubranochiropractic.com/category/uncategorized/feed/
)
)
)
)
)
)
)
)
)
)
)
I have tried to iterate through the array of members with this in the foreach statement, but it doesn’t work:
$xml->param->value->array->data->value->struct->member;
Does anyone know an easy way to easily parse the data here?
ACTUAL XML:
<!--?xml version="1.0"?-->
<methodresponse>
<params>
<param>
<value>
<array><data>
<value><struct>
<member><name>categoryId</name><value><string>4</string></value></member>
<member><name>parentId</name><value><string>0</string></value></member>
<member><name>description</name><value><string>News</string></value></member>
<member><name>categoryDescription</name><value><string></string></value></member>
<member><name>categoryName</name><value><string>News</string></value></member>
<member><name>htmlUrl</name><value><string>http://lubranochiropractic.com/category/news/</string></value></member>
<member><name>rssUrl</name><value><string>http://lubranochiropractic.com/category/news/feed/</string></value></member>
</struct></value>
<value><struct>
<member><name>categoryId</name><value><string>5</string></value></member>
<member><name>parentId</name><value><string>4</string></value></member>
<member><name>description</name><value><string>Testimonials</string></value></member>
<member><name>categoryDescription</name><value><string></string></value></member>
<member><name>categoryName</name><value><string>Testimonials</string></value></member>
<member><name>htmlUrl</name><value><string>http://lubranochiropractic.com/category/news/testimonials/</string></value></member>
<member><name>rssUrl</name><value><string>http://lubranochiropractic.com/category/news/testimonials/feed/</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://lubranochiropractic.com/category/uncategorized/</string></value></member>
<member><name>rssUrl</name><value><string>http://lubranochiropractic.com/category/uncategorized/feed/</string></value></member>
</struct></value>
</data></array>
</value>
</params>
</methodresponse>
Thanks.
Rick
FINAL SOLUTION (With the help provided by E_p)
This builds a dropdown menu of the categories from the XML-RPC response from wp.getCategories or metaWeblog.getCategories.
$categories = wpGetCategories($url, $username, $password);
$select_string = "<select name=\"cats\">";
$xml = simplexml_load_string($categories);
foreach ($xml->params->param->value->array->data->value as $dataSet) {
foreach ($dataSet->struct->member as $member) {
if ($member->name == "categoryId") $cat_id = $member->value->string;
if ($member->name == "description") $cat_name = $member->value->string;
}
$select_string .= "<option value=\"" . $cat_id . "\">" . $cat_name . "</option>";
}
$select_string .= "</select>";
Tried :
returns:
So in your case
foreach ($xml->param->value->array->data->value->struct->member as $member)should workCan you provide xml you parse.
Tried with your xml (it had syntax error):
output
Though it works parse should be more complicated as they use xml to specify types.