PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, May 17, 2022

[FIXED] How do I loop through a XML file with repeating nodes with PHP

 May 17, 2022     loops, php, simplexml, xml     No comments   

Issue

I would like to use PHP to loop through an XML file from an API response, to create an array with the XML folder nodes id and name, sort the array content descending (by id), and echo/return the name content.

XML content:

<?xml version="1.0"?>
<success>
    <document>
        <folder>
            <id>295</id>
            <name>My Folder</name>
            <parent>
                <folder>
                    <id>83</id>
                    <name>Contents</name>
                    <parent>
                        <folder>
                            <id>45</id>
                            <name>Sub Folder</name>
                            <parent>
                                <folder>
                                    <id>21</id>
                                    <name>Root Folder</name>
                                </folder>
                            </parent>
                        </folder>
                    </parent>
                </folder>
            </parent>
        </folder>
    </document>
</success>

I tried a few things myself with SimpleXML but keep getting stuck because the XML output has these nested <parent> nodes and I am not sure how to handle these, to just get the id and name nodes.

This is the PHP part I have so far:

<?php

if (file_exists('api_results.xml')) {
    $xml = simplexml_load_string('api_results.xml');
    
    foreach($xml->document->folder as $folder)
    {
        $folders = array();
        
        foreach($folder as $key => $value)
        {
            $folder[(string)$key] = (string)$value;
        }
        
        $folders[] = $folder;
    }

print_r($folders);
      
} else {
    exit('Failed to open api_results.xml.');
}

How can I create an array and just add each id/name node and then sort the array content?


Solution

You can use XPath, which allows you to search for a list of the <folder> nodes. Using //folder will search at all levels of the document and saves you having to worry about nested foreach loops.

You can then use $folder->id to fetch the <id> element within each <folder>.

One thing is that you should be using simplexml_load_file() to loads data form a file, the string version is designed to load from a string.

$xml = simplexml_load_file('api_results.xml');

$folders = [];
foreach ($xml->xpath('//folder') as $folder) {
    $folders[] = [(string)$folder->id, (string)$folder->name];
}

print_r($folders);

Which for your test document gives...

Array
(
    [0] => Array
        (
            [0] => 295
            [1] => My Folder
        )

    [1] => Array
        (
            [0] => 83
            [1] => Contents
        )

    [2] => Array
        (
            [0] => 45
            [1] => Sub Folder
        )

    [3] => Array
        (
            [0] => 21
            [1] => Root Folder
        )

)


Answered By - Nigel Ren
Answer Checked By - Mary Flores (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing