Jump to content

Parsing XML


terrid25

Recommended Posts

Hi

 

I have an XML file that I've been trying to parse with some success.

 

<?xml version='1.0' encoding='ISO-8859-1'?>
  <Notes>
    <Madrid>
     <trip>
      <ID>12518980</ID>
      <Duration>130</Duration>
     </trip>
     <trip>
      <ID>12518981</ID>
      <Duration>600</Duration>
     </trip>
     <trip>
      <ID>12518982</ID>
      <Duration>50</Duration>
     </trip>
    </Madrid>
    <London>
     <trip>
      <ID>12518983</ID>
      <Duration>Suzuki</Duration>
     </trip>
    </London>
    <Chicago>
     <trip>
      <ID>12518984</ID>
      <Duration>1600</Duration>
     </trip>
    <Chicago>
  </Notes>

 

I am able to get all the nodes that I want, which is mainly ID and duration using:

 

  $objDOM = new DOMDocument();
  $objDOM->load("data.xml");

  $note = $objDOM->getElementsByTagName("trip");
  foreach( $note as $value )
  {
    $ids = $value->getElementsByTagName("ID");
    $id  = $ids->item(0)->nodeValue;

    $durations = $value->getElementsByTagName("Duration");
    $duration  = $duration->item(0)->nodeValue;

   echo "ID is:".$id."<br />";
    echo "Duration is:".$duration."<br />";
  } 

 

What I'd really like to do, is to the get duration and ID for each of the parent nodes, i.e. Mardid, London and Chicago, without having 3 separate foreach loops, if that is possible?

 

 

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/
Share on other sites

Like this?

 

Array
(
    [Madrid] => Array
        (
            [0] => Array
                (
                    [iD] => 12518980
                    [Duration] => 130
                )

            [1] => Array
                (
                    [iD] => 12518981
                    [Duration] => 600
                )

            [2] => Array
                (
                    [iD] => 12518982
                    [Duration] => 50
                )

        )

    [London] => Array
        (
            [0] => Array
                (
                    [iD] => 12518983
                    [Duration] => Suzuki
                )

        )

    [Chicago] => Array
        (
            [0] => Array
                (
                    [iD] => 12518984
                    [Duration] => 1600
                )

        )

)

 

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1193362
Share on other sites

$objDOM = new DOMDocument();
$objDOM->load("data.xml");

$cities = $objDOM->getElementsByTagName("Notes");
foreach($cities as $city) {
    $trip = $city->getElementsByTagName("trip");
    foreach($trip as $value) {
        // Get each trip's details, $city having the parent node's name.
    }
}

It's just pseudo code, but it demonstrates the logic.

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1193367
Share on other sites

<pre>
<?
$xml = '<Notes>
    <Madrid>
     <trip>
      <ID>12518980</ID>
      <Duration>130</Duration>
     </trip>
     <trip>
      <ID>12518981</ID>
      <Duration>600</Duration>
     </trip>
     <trip>
      <ID>12518982</ID>
      <Duration>50</Duration>
     </trip>
    </Madrid>
    <London>
     <trip>
      <ID>12518983</ID>
      <Duration>Suzuki</Duration>
     </trip>
    </London>
    <Chicago>
     <trip>
      <ID>12518984</ID>
      <Duration>1600</Duration>
     </trip>
    </Chicago>
  </Notes>';

$xmlObject = simplexml_load_string($xml);
$results = array();

foreach($xmlObject->children() as $city) {
	foreach($city->children() as $trip)
		$results[$city->getName()][] = array('ID' => (string)$trip->ID, 'Duration' => (string)$trip->Duration);
}

print_r($results);
?>
</pre>

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1193380
Share on other sites

Like this?

 

Array
(
    [Madrid] => Array
        (
            [0] => Array
                (
                    [iD] => 12518980
                    [Duration] => 130
                )

            [1] => Array
                (
                    [iD] => 12518981
                    [Duration] => 600
                )

            [2] => Array
                (
                    [iD] => 12518982
                    [Duration] => 50
                )

        )

    [London] => Array
        (
            [0] => Array
                (
                    [iD] => 12518983
                    [Duration] => Suzuki
                )

        )

    [Chicago] => Array
        (
            [0] => Array
                (
                    [iD] => 12518984
                    [Duration] => 1600
                )

        )

)

 

Yeah something like that, but, if possible, in each of the array, could I also pull in the city?

 

    [Chicago] => Array
        (
            [0] => Array
                (
                    [iD] => 12518984
                    [Duration] => 1600
                    [City] => Chicago
                )

        )

 

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1194191
Share on other sites

Easy:

 

<pre>
<?
$xml = '<Notes>
    <Madrid>
     <trip>
      <ID>12518980</ID>
      <Duration>130</Duration>
     </trip>
     <trip>
      <ID>12518981</ID>
      <Duration>600</Duration>
     </trip>
     <trip>
      <ID>12518982</ID>
      <Duration>50</Duration>
     </trip>
    </Madrid>
    <London>
     <trip>
      <ID>12518983</ID>
      <Duration>Suzuki</Duration>
     </trip>
    </London>
    <Chicago>
     <trip>
      <ID>12518984</ID>
      <Duration>1600</Duration>
     </trip>
    </Chicago>
  </Notes>';

$xmlObject = simplexml_load_string($xml);
$results = array();

foreach($xmlObject->children() as $city) {
	foreach($city->children() as $trip)
		$results[$city->getName()][] = array('ID' => (string)$trip->ID, 'Duration' => (string)$trip->Duration, 'City' => $city->getName());
}

print_r($results);
?>
</pre>

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1194233
Share on other sites

Easy:

 

<pre>
<?
$xml = '<Notes>
    <Madrid>
     <trip>
      <ID>12518980</ID>
      <Duration>130</Duration>
     </trip>
     <trip>
      <ID>12518981</ID>
      <Duration>600</Duration>
     </trip>
     <trip>
      <ID>12518982</ID>
      <Duration>50</Duration>
     </trip>
    </Madrid>
    <London>
     <trip>
      <ID>12518983</ID>
      <Duration>Suzuki</Duration>
     </trip>
    </London>
    <Chicago>
     <trip>
      <ID>12518984</ID>
      <Duration>1600</Duration>
     </trip>
    </Chicago>
  </Notes>';

$xmlObject = simplexml_load_string($xml);
$results = array();

foreach($xmlObject->children() as $city) {
	foreach($city->children() as $trip)
		$results[$city->getName()][] = array('ID' => (string)$trip->ID, 'Duration' => (string)$trip->Duration, 'City' => $city->getName());
}

print_r($results);
?>
</pre>

 

Excellent! Thanks!

 

How do I access each element though, i.e.

 

echo "ID is: .$variable";
echo "Duration is: .$variable";
echo "City is: .$variable";

 

for each of the array items?

 

Thanks

Link to comment
https://forums.phpfreaks.com/topic/231957-parsing-xml/#findComment-1194953
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.