PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

xml_parser_free> <xml_parser_create_ns
Last updated: Fri, 11 Apr 2008

view this page in

xml_parser_create

(PHP 4, PHP 5)

xml_parser_create — Crea un parser XML

Descrizione

resource xml_parser_create ([ string $codifica ] )

La funzione xml_parser_create() crea un nuovo parser XML e restituisce un handle da utilizzarsi con le altre funzioni XML.

Il parametro opzionale codifica indica la codifica dei caratteri in input ed output per il PHP 4. A partire dal PHP 5, la codifica dell'input è determinata automaticamente, pertanto il parametro codifica indica solo dal codifica dell'output. In PHP 4, la codifica di default dell'output è la medesima utilizzata dall'input. Se si indica una stringa vuota, il parser tenta di inviduare la codifica utilizzata per il documento guardando l'intestazione dello stesso. In PHP 5.0.0 a 5.0.1, il set di caratteri di default è l' ISO-8859-1, mentre in PHP 5.0.2 e successivi è UTF-8. Le codifiche supportate sono "ISO-8859-1", "UTF-8" e "US-ASCII".

Vedere anche xml_parser_create_ns() e xml_parser_free().



xml_parser_free> <xml_parser_create_ns
Last updated: Fri, 11 Apr 2008
 
add a note add a note User Contributed Notes
xml_parser_create
big_chief at gmx dot de
22-Apr-2008 04:03
If you have multiple entries with the same key, exchange the lower part of the earlier mentioned script by this and it should solve the problem:

        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\']]';
            eval('$tmp = '.$php_stmt.';');
            if (isset($tmp)) {
                if (!is_array($tmp))
                    eval($php_stmt . ' = array( 0 => $tmp);');
                eval($php_stmt . '[] = $xml_elem[\'value\'];');
            } else
                eval($php_stmt . ' = $xml_elem[\'value\'];');
        }
jonathancnewcomb at msn dot com
19-Jan-2008 10:25
The above script doesnt parse very well for large (over 1000 tags) xml files because the foreach() uses a lot of memory. To solve the problem, replace foreach() with a for(), since for loops do not use near as much memory as the foreach. All in all though, very handy script
juanhdv at NOSPAM dot divvol dot org
05-Dec-2007 12:08
In PHP 5, when including in your xml file the definition '<?xml version="1.0" encoding="ISO-8859-1" ?>',   I'd also recommend adding the option below:
 
xml_parser_set_option($xml_parser,XML_OPTION_TARGET_ENCODING, "ISO-8859-1").

It works fine!

If your enconding is 'UTF-8', just replace 'ISO-8859-1'.
19-Apr-2006 07:42
I'd also recommend adding the option below
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
Kim
22-Feb-2006 02:20
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/)
Tobbe
25-May-2005 06:01
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.
dma05 at web dot de
27-Apr-2005 02:54
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.
php at stock-consulting dot com
21-Feb-2005 02:47
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)
jcalvert at gmx dot net
03-Apr-2004 10:39
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.
annettetruong at yahoo dot com
26-Mar-2004 10:21
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
mmustafa at vsnl dot com
05-Jan-2004 10:00
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
                        )

                )

        )

)

xml_parser_free> <xml_parser_create_ns
Last updated: Fri, 11 Apr 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites