|
|
|
| Если XML файл не содержит <?xml version="1.0" ?>, тогда все идеально
работает.
Если содержит тогда ошибка "XML error: syntax error at line 1"
<?php
$xml = array();
$counter = 0;
$write = "";
$main = "";
function startElement ($parser,$name,$atrb)
{
global $xml, $write, $main;
switch($name)
{
case "CHANNEL": $main = "CHANNEL"; break;
case "BOOK": $main = "BOOK"; break;
default: $write = $name; break;
}
}
function endElement($parser, $name)
{
global $xml, $write, $counter;
$write = "";
if ($name == "BOOK")
{
$counter++;
}
}
function characterData($parser, $data) {
global $xml, $write, $main, $counter;
switch($main)
{
case "CHANNEL":
if (isset($xml[$write])) {
$xml[$write] .= $data;
} else {
$xml[$write] = $data;
}
break;
case "BOOK":
if (isset($xml[$main][$counter][$write])) {
$xml[$main][$counter][$write] .= $data;
} else {
$xml[$main][$counter][$write] = $data;
}
break;
}
}
$url = "books.xml";
$fp = fopen($url,'r');
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
print_r ($xml);
?>
|
books.xml
<channel>
<book>
<author>Pushkin</author>
<title>ABC</title>
</book>
<book>
<author>Pushkin</author>
<title>DEF</title>
</book>
<book>
<author>Pushkin</author>
<title>GHI</title>
</book>
</channel>
|
<? xml version="1.0" ?>
<channel>
<book>
<author>Pushkin</author>
<title>ABC</title>
</book>
<book>
<author>Pushkin</author>
<title>DEF</title>
</book>
<book>
<author>Pushkin</author>
<title>GHI</title>
</book>
</channel>
|
| |
|
|
|
|
|
|
|
для: Ady
(29.05.2007 в 17:51)
| | Лишний пробел между '<?' и 'xml'. Нужно так:
| |
|
|
|
|
|
|
|
для: Ady
(29.05.2007 в 17:51)
| | Нечасто увидишь честный XML-парсинг.
Респект автору. | |
|
|
|