Solved

Parsing Nested XML With PHP

Posted on 2013-01-18
5
310 Views
Last Modified: 2013-01-18
Our monitoring service has an API that I am trying to parse the XML from.  I checked out magicparser.com which seems to be able to output it correctly, but can't for the life of me figure out how to output what I need.  

I'm fairly new to XML with PHP, but have been using PHP for over a decade.  

Ant point in the right direction would be appreciated.

Attached is a snippet of the API output.
alerts.xml
0
Comment
Question by:jonathanbyers
  • 2
  • 2
5 Comments
 
LVL 27

Expert Comment

by:Lukasz Chmielewski
Comment Utility
SimpleXML is your friend:

http://php.net/manual/en/function.simplexml-load-file.php

<?php
error_reporting(E_ALL);

$xml = simplexml_load_file("alerts.xml");

echo '<pre>';
print_r($xml);

echo $xml->items->client[0]->clientid;

Open in new window

0
 
LVL 108

Accepted Solution

by:
Ray Paseur earned 500 total points
Comment Utility
I find the combination of the <pre> tag with the foreach() iterator and var_dump() makes this work much easier.
http://www.laprbass.com/RAY_temp_jonathanbyers.php

<?php // RAY_temp_jonathanbyers.php
error_reporting(E_ALL);
echo '<pre>';

$url = 'http://filedb.experts-exchange.com/incoming/2013/01_w03/628988/alerts.xml';
$xml = file_get_contents($url);
$obj = SimpleXML_Load_String($xml);

// USE ITERATORS TO ACCESS THE OBJECT PROPERTIES
foreach ($obj->items->client as $c)
{
    // var_dump($c);
    echo PHP_EOL . $c->clientid;
    foreach ($c->site->workstations->workstation as $w)
    {
        // var_dump($w);
        echo PHP_EOL . '  ' .$w->id;
        foreach ($w->failed_checks->check as $k)
        {
            // var_dump($k);
            echo PHP_EOL . '    ' . $k->checkid;
            echo PHP_EOL . '    ' . $k->check_type;
            echo PHP_EOL;
        }
    }
}
echo PHP_EOL;

// VISUALIZE THE ENTIRE OBJECT
var_dump($obj);

Open in new window

0
 

Author Comment

by:jonathanbyers
Comment Utility
@Roads_Roads

This is what I have so far, which is perfect, but I need to show all of the information, not just for client[0].

Ray, can you expand on this with foreach()?  

<?php
error_reporting(E_ALL);

$xml = simplexml_load_file("alerts.xml");

echo '<pre>';
//print_r($xml);

echo $xml->items->client[0]->clientid . " | ";
echo $xml->items->client[0]->name . " | ";
echo $xml->items->client[0]->site[0]->name . " | ";
echo $xml->items->client[0]->site[0]->workstations[0]->workstation[0]->name . " | ";
echo $xml->items->client[0]->site[0]->workstations[0]->workstation[0]->failed_checks->check[0]->description . ": ";
echo $xml->items->client[0]->site[0]->workstations[0]->workstation[0]->failed_checks->check[0]->formatted_output . " ";
echo "<a href=\"https://www.-website-here.us/api/?apikey=apikeyhere&service=clear_check&checkid=";
echo $xml->items->client[0]->site[0]->workstations[0]->workstation[0]->failed_checks->check[0]->checkid . "\">";
echo $xml->items->client[0]->site[0]->workstations[0]->workstation[0]->failed_checks->check[0]->checkid;
echo "</a>"

?>

Open in new window

0
 

Author Comment

by:jonathanbyers
Comment Utility
Ray, I took what you had and was able to make things work.

Thanks!

<?php // RAY_temp_jonathanbyers.php
error_reporting(E_ALL);
echo '<pre>';

$url = 'http://filedb.experts-exchange.com/incoming/2013/01_w03/628988/alerts.xml';
$xml = file_get_contents($url);
$obj = SimpleXML_Load_String($xml);

// USE ITERATORS TO ACCESS THE OBJECT PROPERTIES
foreach ($obj->items->client as $c)
{
    // var_dump($c);
    echo PHP_EOL;
    echo PHP_EOL . $c->clientid . " | ";
    echo $c->name;
    foreach ($c->site->servers->server as $w)
    {
        // var_dump($w);
        echo PHP_EOL . $w->id . " | ";
        echo $w->name . " | ";
        foreach ($w->failed_checks->check as $k)
        {
            // var_dump($k);
            echo $k->checkid . " | ";
            echo $k->description;
            //echo PHP_EOL;
        }
    }
}
echo PHP_EOL;

// VISUALIZE THE ENTIRE OBJECT
//var_dump($obj);
?>

Open in new window

0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
Thanks for the points and thanks for using EE.  Going forward, please feel free to share the points with others who offer good answers.  The first post by Roads_Roads is also a valid way of looking at the issue.

And a small sidebar note.  Lose the ?> close-PHP tag if at all possible.  At least don't use it reflexively.  There are a host of reasons to avoid it, and the Zend Coding Standard dis-recommends it.  So if your script can work without it, make it standard practice to leave it out.

Best regards, ~Ray
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Deprecated and Headed for the Dustbin By now, you have probably heard that some PHP features, while convenient, can also cause PHP security problems.  This article discusses one of those, called register_globals.  It is a thing you do not want.  …
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now