How to read unknown XML structure file to Array

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • abdoelmasry
    New Member
    • Oct 2006
    • 104

    How to read unknown XML structure file to Array

    Hi Pros

    I need help to read xml to array,

    xml file structure is unknown, and has many elements and subelements,

    so it should be imported to multiple array.

    here is xml file as example:
    file name: test.xml
    Code:
    <?xml version="1.0" encoding="windows-1256" ?>
    <books id="1">
    <category id="1" name="cat 1">
    <book id="1" name="cat 1 book1">
    <minibook id="1" name="cat 1 - book1 - minibook 1"></minibook>
    <minibook id="2" name="cat 1 - book1 - minibook 2"></minibook>
    <minibook id="3" name="cat 1 - book1 - minibook 3"></minibook>
    <minibook id="4" name="cat 1 - book1 - minibook 4"></minibook>
    </book>
    <book id="2" name="cat 1 book2">
    <minibook id="1" name="cat 1 - book2 - minibook 1"></minibook>
    <minibook id="2" name="cat 1 - book2 - minibook 2"></minibook>
    <minibook id="3" name="cat 1 - book2 - minibook 3"></minibook>
    <minibook id="4" name="cat 1 - book2 - minibook 4"></minibook>
    </book>
    <book id="3" name="cat 1 book3">
    <minibook id="1" name="cat 1 - book3 - minibook 1"></minibook>
    <minibook id="2" name="cat 1 - book3 - minibook 2"></minibook>
    <minibook id="3" name="cat 1 - book3 - minibook 3"></minibook>
    <minibook id="4" name="cat 1 - book3 - minibook 4"></minibook>
    </book>
    </category>
    <category id="2" name="cat 2">
    <book id="1" name="cat 2 book1">
    <minibook id="1" name="cat 2 - book1 - minibook 1"></minibook>
    <minibook id="2" name="cat 2 - book1 - minibook 2"></minibook>
    <minibook id="3" name="cat 2 - book1 - minibook 3"></minibook>
    <minibook id="4" name="cat 2 - book1 - minibook 4"></minibook>
    </book>
    <book id="2" name="cat 2 book2">
    <minibook id="1" name="cat 2 - book2 - minibook 1"></minibook>
    <minibook id="2" name="cat 2 - book2 - minibook 2"></minibook>
    <minibook id="3" name="cat 2 - book2 - minibook 3"></minibook>
    <minibook id="4" name="cat 2 - book2 - minibook 4"></minibook>
    </book>
    <book id="3" name="cat 2 book3">
    <minibook id="1" name="cat 2 - book3 - minibook 1"></minibook>
    <minibook id="2" name="cat 2 - book3 - minibook 2"></minibook>
    <minibook id="3" name="cat 2 - book3 - minibook 3"></minibook>
    <minibook id="4" name="cat 2 - book3 - minibook 4"></minibook>
    </book>
    </category>
    <category id="3" name="cat 3">
    <book id="1" name="cat 3 book1">
    <minibook id="1" name="cat 3 - book1 - minibook 1"></minibook>
    <minibook id="2" name="cat 3 - book1 - minibook 2"></minibook>
    <minibook id="3" name="cat 3 - book1 - minibook 3"></minibook>
    <minibook id="4" name="cat 3 - book1 - minibook 4"></minibook>
    </book>
    <book id="2" name="cat 3 book2">
    <minibook id="1" name="cat 3 - book2 - minibook 1"></minibook>
    <minibook id="2" name="cat 3 - book2 - minibook 2"></minibook>
    <minibook id="3" name="cat 3 - book2 - minibook 3"></minibook>
    <minibook id="4" name="cat 3 - book2 - minibook 4"></minibook>
    </book>
    <book id="3" name="cat 3 book3">
    <minibook id="1" name="cat 3 - book3 - minibook 1"></minibook>
    <minibook id="2" name="cat 3 - book3 - minibook 2"></minibook>
    <minibook id="3" name="cat 3 - book3 - minibook 3"></minibook>
    <minibook id="4" name="cat 3 - book3 - minibook 4"></minibook>
    </book>
    </category>
    <category id="4" name="cat 4">
    <book id="1" name="cat 4 book1">
    <minibook id="1" name="cat 4 - book1 - minibook 1"></minibook>
    <minibook id="2" name="cat 4 - book1 - minibook 2"></minibook>
    <minibook id="3" name="cat 4 - book1 - minibook 3"></minibook>
    <minibook id="4" name="cat 4 - book1 - minibook 4"></minibook>
    </book>
    <book id="2" name="cat 4 book2">
    <minibook id="1" name="cat 4 - book2 - minibook 1"></minibook>
    <minibook id="2" name="cat 4 - book2 - minibook 2"></minibook>
    <minibook id="3" name="cat 4 - book2 - minibook 3"></minibook>
    <minibook id="4" name="cat 4 - book2 - minibook 4"></minibook>
    </book>
    <book id="3" name="cat 4 book3">
    <minibook id="1" name="cat 4 - book3 - minibook 1"></minibook>
    <minibook id="2" name="cat 4 - book3 - minibook 2"></minibook>
    <minibook id="3" name="cat 4 - book3 - minibook 3"></minibook>
    <minibook id="4" name="cat 4 - book3 - minibook 4"></minibook>
    </book>
    </category>
    <category id="5" name="cat 5">
    <book id="1" name="cat 5 book1">
    <minibook id="1" name="cat 5 - book1 - minibook 1"></minibook>
    <minibook id="2" name="cat 5 - book1 - minibook 2"></minibook>
    <minibook id="3" name="cat 5 - book1 - minibook 3"></minibook>
    <minibook id="4" name="cat 5 - book1 - minibook 4"></minibook>
    </book>
    <book id="2" name="cat 5 book2">
    <minibook id="1" name="cat 5 - book2 - minibook 1"></minibook>
    <minibook id="2" name="cat 5 - book2 - minibook 2"></minibook>
    <minibook id="3" name="cat 5 - book2 - minibook 3"></minibook>
    <minibook id="4" name="cat 5 - book2 - minibook 4"></minibook>
    </book>
    <book id="3" name="cat 5 book3">
    <minibook id="1" name="cat 5 - book3 - minibook 1"></minibook>
    <minibook id="2" name="cat 5 - book3 - minibook 2"></minibook>
    <minibook id="3" name="cat 5 - book3 - minibook 3"></minibook>
    <minibook id="4" name="cat 5 - book3 - minibook 4"></minibook>
    </book>
    </category>
    </books>
    my php code is not working, here is it:
    Code:
    <?php
    
    //get Element attributes
    function get_attributes($element){
    $attrib_array=array();
    $element_attributes=$element->attributes;
    foreach($element_attributes as $attrib){
    $attrib_array[$attrib->name]=$attrib->value;
    }
    return $attrib_array;
    }
    
    //get xml Elements to array
    function get_elements($Elements_list){
    foreach($Elements_list as $xml_element){
    // NodeType (1) means this is Element not #text or CDATA
    if($xml_element->nodeType=='1'){
    //get Element id for Array Key
    $elemid=$xml_element->getAttribute('id');
    $elemtagname=$xml_element->tagName;
    $currentlevel=array();
    //Get Element Attributes if it has
    //If this element Has Attributes it will be added to Array '$attr_array'
    $attr_array=array();
    if($xml_element->hasAttributes()){
    $attr_array=$this->get_attributes($xml_element);
    }
    $currentlevel[$elemid]['tagname']=$xml_element->tagName;
    $currentlevel[$elemid]['attribute']=$attr_array;
    $currentlevel[$elemid]['content']=$xml_element->nodeValue;
    //get child Nodes for every Element (if exists)
    if($xml_element->hasChildNodes()){
    $currentlevel[$elemid]['child']=$this->get_elements($xml_element->childNodes);
    }
    }
    }
    return $currentlevel;
    }
    
    //cals Function
    $xml_file=new DOMDocument();
    $xml_file->load("test.xml");
    $xml_childs=$xml_file->getElementsByTagName("books");
    $xml_to_array=get_elements($xml_childs);
    
    // Array $xml_to_array should hold all Xml data
    ?>
    the problem is : i cann't build xml data (elements,child nodes) properly to array.

    thank you
  • Dormilich
    Recognized Expert Expert
    • Aug 2008
    • 8694

    #2
    what do you need the array for?

    Comment

    • abdoelmasry
      New Member
      • Oct 2006
      • 104

      #3
      i am php developer, i am working a lot with xml files,

      for example: i develop php script works with 100 xml files,

      by the normal way, i should be know the file structure to use this way:

      getElementByTag name();

      and that will force me to write 100 functions to read the 100 xml files,

      i need to create class to read any xml file, it will be so easy to pass xml files path to class, and class read all data and dump it to array

      Comment

      • binhvtt
        New Member
        • Feb 2011
        • 1

        #4
        You can convert XML to Json and Json to array.

        Comment

        • abdoelmasry
          New Member
          • Oct 2006
          • 104

          #5
          it should be by PHP5, no client side codes.

          Comment

          • Dormilich
            Recognized Expert Expert
            • Aug 2008
            • 8694

            #6
            SimpleXML offers a fine XML reading class.

            Comment

            • abdoelmasry
              New Member
              • Oct 2006
              • 104

              #7
              i checked it before coming here,

              no reference to Read xml file to Multi Dimensional Array.

              Comment

              • Dormilich
                Recognized Expert Expert
                • Aug 2008
                • 8694

                #8
                normally you don’t need to convert XML to an multidimensiona l array. you have Iterators for that which can operate on the SimpleXMLElemen t objects.

                Comment

                Working...