Open In App

PHP | xml_parse_into_struct() Function

The xml_parse_into_struct() function is an inbuilt function in PHP which is used to parse XML data into an array structure. The XML data are parsed into two parallel array structures, first one is index array that contains pointers to the location of the values in the value array and second one is value array that contains the data from the parsed XML.

Syntax: 



int xml_parse_into_struct( resource $xml_parser, string $data,
                                        array $values, array $index )

Parameters: This function accepts four parameters as mentioned above and described below:  

Return Value: This function returns 1 on success and 0 on failure. It is not same as True and False.



Note:  

gfg.xml file:  




<?xml version="1.0" encoding="utf-8"?>
<user>
    <username> user123 </username>
    <name> firstname lastname </name>
    <phone> +91-9876543210 </phone>
    <detail> I am John Doe. Live in Kolkata, India. </detail>
</user>

Program 1: 




<?php
 
// Create an xml parser
$xml_parser = xml_parser_create();
 
// Opening xml file in file stream
$filePointer = fopen("sample.xml", "r");
 
// Reading XML data from the
// specified XML file
$xml_data = fread($filePointer, 4096);
  
// Parsing XML data into an
// array structure
xml_parse_into_struct($xml_parser,
                $xml_data, $values);
 
// Free to xml parse
xml_parser_free($xml_parser);
 
// Display array structured XML data
print_r($values);
 
// Closing the XML file
fclose($filePointer);
 
?>

Output: 

Array
(
    [0] => Array
        (
            [tag] => USER
            [type] => open
            [level] => 1
            [value] => 
        )
    [1] => Array
        (
            [tag] => USERNAME
            [type] => complete
            [level] => 2
            [value] =>  user123 
        )
    [2] => Array
        (
            [tag] => USER
            [value] => 
            [type] => cdata
            [level] => 1
        )
    [3] => Array
        (
            [tag] => NAME
            [type] => complete
            [level] => 2
            [value] =>  firstname lastname 
        )
    [4] => Array
        (
            [tag] => USER
            [value] => 
            [type] => cdata
            [level] => 1
        )
    [5] => Array
        (
            [tag] => PHONE
            [type] => complete
            [level] => 2
            [value] =>  +91-9876543210 
        )
    [6] => Array
        (
            [tag] => USER
            [value] => 
            [type] => cdata
            [level] => 1
        )
    [7] => Array
        (
            [tag] => DETAIL
            [type] => complete
            [level] => 2
            [value] =>  I am John Doe. Live in Kolkata, India. 
        )
    [8] => Array
        (
            [tag] => USER
            [value] => 
            [type] => cdata
            [level] => 1
        )
    [9] => Array
        (
            [tag] => USER
            [type] => close
            [level] => 1
        )
)

geeks.xml file: 




<?xml version="1.0"?>
<atoms>
    <atom>
        <name>Carbon</name>
        <symbol>C</symbol>
        <atomic_no>6</atomic_no>
    </atom>
    <atom>
        <name>Hydrogen</name>
        <symbol>H</symbol>
        <atomic_no>1</atomic_no>
    </atom>
    <atom>
        <name>Helium</name>
        <symbol>He</symbol>
        <atomic_no>2</atomic_no>
    </atom>
    <atom>
        <name>Iron</name>
        <symbol>Fe</symbol>
        <atomic_no>26</atomic_no>
    </atom>
</atoms>

Program 2: 




<?php
  
class Atom {
    var $name// Name of the element
    var $symbol;    // Symbol for the atom
    var $atomic_no// Atomic number
     
    // Constructor for Atom class
    function __construct( $aa ) {
         
        // Initializing or setting the values
        // to the field of the Atom class
        foreach ($aa as $k=>$v)
            $this->$k = $aa[$k];
    }
}
  
function read_data($filename) {
     
    // Read the XML database of atoms
    $xml_data = implode("", file($filename));
     
    // Creating an xml parser
    $xml_parser = xml_parser_create();
     
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($xml_parser, $xml_data, $values, $tags);
     
    // Free to xml parser
    xml_parser_free($xml_parser);
  
    // Iterating through the structures
    foreach ($tags as $key=>$val) {
         
        if ($key == "atom") {
             
            $atom_ranges = $val;
             
            // Each contiguous pair of array entries
            // are the lower and upper range for
            // each molecule definition
            for($i = 0; $i < count($atom_ranges); $i += 2) {
                $offset = $atom_ranges[$i] + 1;
                $len = $atom_ranges[$i + 1] - $offset;
                 
                // Parsing atom data
                $tdb[] = parseAtoms(array_slice($values, $offset, $len));
            }
        }
        else {
            continue;
        }
    }
    return $tdb;
}
 
// parseAtoms function to parse atom
function parseAtoms($mvalues) {
    for ($i = 0; $i < count($mvalues); $i++) {
        $ato[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
    }
    return new Atom($ato);
}
 
$db = read_data("atoms.xml");
echo "Database of atoms objects:\n";
print_r($db);
 
?>

Output: 

Database of atoms objects:
Array
(
    [0] => Atom Object
        (
            [name] => Carbon
            [symbol] => C
            [atomic_no] => 6
        )
    [1] => Atom Object
        (
            [name] => Hydrogen
            [symbol] => H
            [atomic_no] => 1
        )
    [2] => Atom Object
        (
            [name] => Helium
            [symbol] => He
            [atomic_no] => 2
        )
    [3] => Atom Object
        (
            [name] => Iron
            [symbol] => Fe
            [atomic_no] => 26
        )
)

Reference: https://www.php.net/manual/en/function.xml-parse-into-struct.php
 


Article Tags :