|
xml_parser_create
Create an XML parser
(PHP 4, PHP 5)
Examples ( Source code ) » xml_parser_create
Related Examples ( Source code ) » xml_parser_create Examples ( Source code ) » SAX parser in action Examples ( Source code ) » A simple XML parser Examples ( Source code ) » Turning an XML Document into an Array Examples ( Source code ) » XML Cdata handler Examples ( Source code ) » Using a Default Handler Examples ( Source code ) » Parsing a Processing Instruction Examples ( Source code ) » Generating Tables from XML Examples ( Source code ) » Transforming XML into Basic HTML Examples ( Source code ) » XML file validation Examples ( Source code ) » SAX Parser Code Examples / Notes » xml_parser_createdma05
xml_parser_create () on php5 sometimes detects the wrong input format for me -- for example, sometimes when i try to parse data that has been fetched from a databse by my script and that only contains a handful of special ISO-8859-1 characters, it seems to think the input was something else and xml_parse() chokes on things like umlauts. the only reason i was able to figure out so far would be that -- unlike my data files -- the xml data generated by my script doesn't contain the <?xml [...] encoding="..." ?> definition. every data source with that definition seemed just fine; it's kinda odd that it worked *sometimes* without it *shrugs*. no matter what the reason, using utf8_encode () on the string made it work, and prepending '<?xml version="1.0" encoding="ISO-8859-1" ?>' worked as well. this problem shouldn't occur in php4, since there you would specify the input encoding along with the output encoding. jcalvert
To maintain compatibility between PHP4 and PHP5 you should always pass a string argument to this function. PHP4 autodetects the format of the input if you leave it out whereas PHP5 will assume the format to be ISO-8859-1 (and choke on the byte order marker of UTF-8 files). Calling the function as <?php $res = xml_parser_create('') ?> will cause both versions of PHP to autodetect the format. mmustafa
thought I'd share this small piece of PHP code that prepares a proper array from XML Data (uses xml_parse_into_struct to get a raw array) features : 1) can easily adjust to multiple levels 2) simple. <code> $file = "data.xml"; $xml_parser = xml_parser_create(); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } $data = fread($fp, filesize($file)); fclose($fp); xml_parse_into_struct($xml_parser, $data, $vals, $index); xml_parser_free($xml_parser); $params = array(); $level = array(); foreach ($vals as $xml_elem) { if ($xml_elem['type'] == 'open') { if (array_key_exists('attributes',$xml_elem)) { list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']); } else { $level[$xml_elem['level']] = $xml_elem['tag']; } } if ($xml_elem['type'] == 'complete') { $start_level = 1; $php_stmt = '$params'; while($start_level < $xml_elem['level']) { $php_stmt .= '[$level['.$start_level.']]'; $start_level++; } $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];'; eval($php_stmt); } } echo "<pre>"; print_r ($params); echo "</pre>"; </code> Example : I/P XML ... <country id="ZZ"> <name>My Land</name> <location>15E</location> <area>40000</area> <state1> <name>Hi State</name> <area>1000</area> <population>2000</population> <city1> <location>13E</location> <population>500</population> <area>500</area> </city1> <city2> <location>13E</location> <population>500</population> <area>5000</area> </city2> </state1> <state2> <name>Low State</name> <area>3000</area> <population>20000</population> <city1> <location>15E</location> <population>5000</population> <area>1500</area> </city1> </state2> </country> O/P Array : Array ( [ZZ] => Array ( [NAME] => My Land [LOCATION] => 15E [AREA] => 40000 [STATE1] => Array ( [NAME] => Hi State [AREA] => 1000 [POPULATION] => 2000 [CITY1] => Array ( [LOCATION] => 13E [POPULATION] => 500 [AREA] => 500 ) [CITY2] => Array ( [LOCATION] => 13E [POPULATION] => 500 [AREA] => 5000 ) ) [STATE2] => Array ( [NAME] => Low State [AREA] => 3000 [POPULATION] => 20000 [CITY1] => Array ( [LOCATION] => 15E [POPULATION] => 5000 [AREA] => 1500 ) ) ) ) tobbe
The above "XML to array" code does not work properly if you have several tags on the same level and with the same name, example: <currenterrors> <error> <description>This is a real error...</description> </error> <error> <description>This is a second error...</description> </error> <error> <description>Lots of errors today...</description> </error> <error> <description>This is the last error...</description> </error> </currenterrors> It will then only display the first <error>-tag. In this case you will need to number the tags automatically or maybe have several arrays for each new element. 19-apr-2006 03:42
I'd also recommend adding the option below xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); annettetruong
Good article explaining how to use PHP to parse an XML RSS feed: http://www.sitepoint.com/article/php-xml-parsing-rss-1-0/2 php
Even though I passed "UTF-8" as encoding type PHP (Version 4.3.3) did *not* treat the input file as UTF-8. The input file was missing the BOM header bytes (which may indeed be omitted, according to RFC3629...but things are a bit unclear there. The RFC seems to make mere recommendations concering the BOM header). If you want to sure that PHP treats an UTF-8 encoded file correctly, make sure that it begins with the corresponding 3 byte BOM header (0xEF 0xBB 0xBF)
kim
Actually, the XML parser DOES support more encodings. The trick is to call $parser = xml_parser_create(""); I learned this trick from http://tinyurl.com/2cmya (http://minutillo.com/steve/weblog/) |
Change Languageutf8_decode utf8_encode xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse_into_struct xml_parse xml_parser_create_ns xml_parser_create xml_parser_free xml_parser_get_option xml_parser_set_option xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler |