xml_parser_create

(PHP 3 >= 3.0.6, PHP 4, PHP 5)

xml_parser_create -- 建立一个 XML 解析器

描述

resource xml_parser_create ( [string encoding] )

函数 xml_parser_create() 建立一个新的 XML 解析器并返回可被其它 XML 函数使用的资源句柄。

可选参数 encoding 在 PHP 4 中用来指定要被解析的 XML 输入的字符编码方式。PHP 5 开始,自动侦测输入的 XML 的编码,因此 encoding 参数仅用来指定解析后输出数据的编码。在 PHP 4 总,默认输出的编码与输入数据的编码是相同的。如果传递了空字符串,解析器会尝试搜索头 3 或 4 个字节以确定文档的编码。在 PHP 5.0.0 和 5.0.1 总,默认输出的字符编码是 ISO-8859-1,而 PHP 5.0.2 及以上版本是 UTF-8。解析器支持的编码有 ISO-8859-1, UTF-8US-ASCII

请参阅函数 xml_parser_create_ns()xml_parser_free()


add a note add a note User Contributed Notes
19-Apr-2006 10:42
I'd also recommend adding the option below
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
Kim
22-Feb-2006 06: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 09: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
28-Apr-2005 05: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 06: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
04-Apr-2004 02: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
27-Mar-2004 02: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
06-Jan-2004 02: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
                       )

               )

       )

)