XML reading problem

Discussion in 'PHP' started by dizyn, Jan 29, 2010.

  1. #1
    I wanted to read xml with following code:

    I can read till:
    <LINK LINKTYPE="IMAGE">
    <LINK_URL IMAGE_WIDTH="400" IMAGE_HEIGHT="600">http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>

    after that i have no idea how to read it?? any help please ....

    $xml = simplexml_load_file("events.xml");
    foreach($xml->children() as $child)
    {
    	echo $child["SID"].'-'.$child["STYPE"].'-'.$child["SPRIORITY"].'<br />';
    	echo $child->SHOWNAME.'<br />';
    	echo $child->SHOWSHORT.'<br />';
    	echo $child->SHOWLONG.'<br />';
    	echo $child->BOOKINGFROM.'<br />';
    	echo $child->BOOKINGUNTIL.'<br />';
    	echo $child->VENUE["VID"];
    	echo $child->VENUE->VENUE_NAME;
    	echo $child->LINKS->LINK->LINK_URL;
    	echo $child->LINKS->LINK["LINKTYPE"];
    
    	foreach($child->children() as $child1)
    	{
    		if(!empty($child1->ADDRESS->ADDRESS_1))
    		{
    			echo $child1->ADDRESS->ADDRESS_1;
    			echo $child1->ADDRESS->ADDRESS_2;
    			echo $child1->ADDRESS->POSTCODE;		
    		}
    	}
    }
    Code (markup):
    <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
    <SHOWS>
    <SHOW SID="1597" STYPE="M" SPRIORITY="3">
    <SHOWNAME>My Dancing</SHOWNAME>
    <SHOWSHORT>My Short Des comes here...</SHOWSHORT>
    <SHOWLONG>Long desc comes ehre.....</SHOWLONG>
    <BOOKINGFROM>Friday, 29th September 2009</BOOKINGFROM>
    <BOOKINGUNTIL>Saturday, 23rd October 2010</BOOKINGUNTIL>
    <MATINEES>Friday and Saturday 3pm</MATINEES>
    <EVENINGS>Monday to Saturday 7.30pm</EVENINGS>
    <VENUE VID="1012">
    <VENUE_NAME>My Theatre</VENUE_NAME>
    <ADDRESS>
    <ADDRESS_1>My Addresss 1</ADDRESS_1>
    <ADDRESS_2>My City</ADDRESS_2>
    <POSTCODE>44000</POSTCODE>
    </ADDRESS>
    <LINKS>
    <LINK LINKTYPE="IMAGE">
    <LINK_URL IMAGE_WIDTH="400" IMAGE_HEIGHT="600">http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>
    <LINK_TITLE>Image</LINK_TITLE>
    </LINK>
    <LINK LINKTYPE="SEATINGPLAN">
    <LINK_URL IMAGE_WIDTH="400" IMAGE_HEIGHT="600">http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>
    <LINK_TITLE>Seating Plan</LINK_TITLE>
    </LINK>
    
    </LINKS>
    <VENUE_DIRECTIONS>an directions .....</VENUE_DIRECTIONS>
    <VENUE_LOCATION>
    <VENUE_LONGITUDE>-33.1188</VENUE_LONGITUDE>
    <VENUE_LATITUDE>74.5131</VENUE_LATITUDE>
    </VENUE_LOCATION>
    </VENUE>
    <LINKS>
    <LINK LINKTYPE="IMAGE">
    <LINK_URL IMAGE_WIDTH="100" IMAGE_HEIGHT="150">http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>
    </LINK>
    <LINK LINKTYPE="VIDEO">
    
    <LINK_URL>http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>
    </LINK>
    <LINK LINKTYPE="IMAGE">
    <LINK_URL IMAGE_WIDTH="250" IMAGE_HEIGHT="250">http://www.google.com.pk/intl/en_com/images/logo_plain.png</LINK_URL>
    
    </LINK>
    <LINK LINKTYPE="IMAGE">
    <LINK_URL IMAGE_WIDTH="250" IMAGE_HEIGHT="215">http://www.google.com.pk/images/nav_logo7.png</LINK_URL>
    </LINK>
    <LINK LINKTYPE="SPECIFIC">
    <LINK_URL>http://www.google.com/search?q=Islamabad</LINK_URL>
    
    <LINK_TITLE>Show Details</LINK_TITLE>
    </LINK>
    <LINK LINKTYPE="MEALDEAL">
    <LINK_URL>http://www.google.com/search?q=Lahore</LINK_URL>
    <LINK_TITLE>Show Meal Deals</LINK_TITLE>
    </LINK>
    </LINKS>
    <METAS>
    <META MTYPE="META_TITLE">
    <METADATA>Theatre</METADATA>
    </META>
    <META MTYPE="META_KEYWORDS">
    <METADATA>tickets, agency</METADATA>
    </META>
    <META MTYPE="META_DESCRIPTION">
    <METADATA>tickets Book your</METADATA>
    </META>
    </METAS>
    <QUOTES>
    <QUOTE QSORT="10">
    <QUOTETEXT>The live</QUOTETEXT>
    <PUBLICATION>Times</PUBLICATION>
    </QUOTE>
    </QUOTES>
    </SHOW>
    Code (markup):

     
    dizyn, Jan 29, 2010 IP
  2. HivelocityDD

    HivelocityDD Peon

    Messages:
    179
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Please try the following code. This will make the xml data to corresponding array.

    
    function xml2array($contents, $get_attributes=1, $priority = 'tag') {
        if(!$contents) return array();
    
        if(!function_exists('xml_parser_create')) {
            //print "'xml_parser_create()' function not found!";
            return array();
        }
    
        //Get the XML parser of PHP - PHP must have this module for the parser to work
        $parser = xml_parser_create('');
        xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); 
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, trim($contents), $xml_values);
        xml_parser_free($parser);
    
        if(!$xml_values) return; 
    
        //Initializations
        $xml_array = array();
        $parents = array();
        $opened_tags = array();
        $arr = array();
    
        $current = &$xml_array; //Refference
    
        //Go through the tags.
        $repeated_tag_index = array();//Multiple tags with same name will be turned into an array
        foreach($xml_values as $data) {
            unset($attributes,$value);//Remove existing values, or there will be trouble
    
            //This command will extract these variables into the foreach scope
            // tag(string), type(string), level(int), attributes(array).
            extract($data);//We could use the array by itself, but this cooler.
    
            $result = array();
            $attributes_data = array();
            
            if(isset($value)) {
                if($priority == 'tag') $result = $value;
                else $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode
            }
    
            //Set the attributes too.
            if(isset($attributes) and $get_attributes) {
                foreach($attributes as $attr => $val) {
                    if($priority == 'tag') $attributes_data[$attr] = $val;
                    else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
                }
            }
    
            //See tag status and do the needed.
            if($type == "open") {//The starting of the tag '<tag>'
                $parent[$level-1] = &$current;
                if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag
                    $current[$tag] = $result;
                    if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
                    $repeated_tag_index[$tag.'_'.$level] = 1;
    
                    $current = &$current[$tag];
    
                } else { //There was another element with the same tag name
    
                    if(isset($current[$tag][0])) {//If there is a 0th element it is already an array
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                        $repeated_tag_index[$tag.'_'.$level]++;
                    } else {//This section will make the value an array if multiple tags with the same name appear together
                        $current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array
                        $repeated_tag_index[$tag.'_'.$level] = 2;
                        
                        if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well
                            $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                            unset($current[$tag.'_attr']);
                        }
    
                    }
                    $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
                    $current = &$current[$tag][$last_item_index];
                }
    
            } elseif($type == "complete") { //Tags that ends in 1 line '<tag />'
                //See if the key is already taken.
                if(!isset($current[$tag])) { //New Key
                    $current[$tag] = $result;
                    $repeated_tag_index[$tag.'_'.$level] = 1;
                    if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;
    
                } else { //If taken, put all things inside a list(array)
                    if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array...
    
                        // ...push the new element into that array.
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                        
                        if($priority == 'tag' and $get_attributes and $attributes_data) {
                            $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                        }
                        $repeated_tag_index[$tag.'_'.$level]++;
    
                    } else { //If it is not an array...
                        $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
                        $repeated_tag_index[$tag.'_'.$level] = 1;
                        if($priority == 'tag' and $get_attributes) {
                            if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well
                                
                                $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                                unset($current[$tag.'_attr']);
                            }
                            
                            if($attributes_data) {
                                $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                            }
                        }
                        $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken
                    }
                }
    
            } elseif($type == 'close') { //End of tag '</tag>'
                $current = &$parent[$level-1];
            }
        }
        
        return($xml_array);
    }
    
    
    PHP:

    $contents will be your xml data.
     
    HivelocityDD, Jan 30, 2010 IP
  3. JAY6390

    JAY6390 Peon

    Messages:
    918
    Likes Received:
    31
    Best Answers:
    0
    Trophy Points:
    0
    #3
    Why not just use the DOMDocument()
     
    JAY6390, Jan 30, 2010 IP
  4. gr8webseller

    gr8webseller Peon

    Messages:
    1,097
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    0
    #4
    just study xmlDOM, it is simple
     
    gr8webseller, Jan 31, 2010 IP