2
edits
m (→Hosting) |
No edit summary |
||
Line 78: | Line 78: | ||
The mylist export documentation may be helpful in understanding the meaning of the different fields in the XML replies: [[Mylist_export_template_guidelines]] | The mylist export documentation may be helpful in understanding the meaning of the different fields in the XML replies: [[Mylist_export_template_guidelines]] | ||
==XML Parsing== | |||
To use the XML replies from the server, they have to be parsed and probably cached. | |||
To parse the XML, standard php-commands can be used. | |||
working example for xml.xml with the output array stack().: | |||
{| width="70%" | |||
|<pre><nowiki> | |||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |||
//Load and parse XML | |||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |||
$file = "xml.xml"; | |||
$stack = array(); | |||
// start_element_handler ( resource parser, string name, array attribs ) | |||
function startElement($parser, $name, $attribs) | |||
{ | |||
global $stack; | |||
$tag=array("name"=>$name,"attribs"=>$attribs); | |||
array_push($stack,$tag); | |||
} | |||
// end_element_handler ( resource parser, string name ) | |||
function endElement($parser, $name) | |||
{ | |||
global $stack; | |||
$stack[count($stack)-2]['children'][] = $stack[count($stack)-1]; | |||
array_pop($stack); | |||
} | |||
// handler ( resource parser, string data ) | |||
function characterData($parser, $data) | |||
{ | |||
global $stack,$i; | |||
if(trim($data)) | |||
{ | |||
$stack[count($stack)-1]['data'] .= $data; | |||
} | |||
} | |||
// handler ( resource parser, string target, string data ) | |||
function defaultHandler($parser, $data) | |||
{ | |||
} | |||
function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, | |||
$publicId) { | |||
if ($systemId) { | |||
if (!list($parser, $fp) = new_xml_parser($systemId)) { | |||
printf("Could not open entity %s at %s\n", $openEntityNames, | |||
$systemId); | |||
return false; | |||
} | |||
while ($data = fread($fp, 4096)) { | |||
if (!xml_parse($parser, $data, feof($fp))) { | |||
printf("XML error: %s at line %d while parsing entity %s\n", | |||
xml_error_string(xml_get_error_code($parser)), | |||
xml_get_current_line_number($parser), $openEntityNames); | |||
xml_parser_free($parser); | |||
return false; | |||
} | |||
} | |||
xml_parser_free($parser); | |||
return true; | |||
} | |||
return false; | |||
} | |||
function new_xml_parser($file) | |||
{ | |||
global $parser_file; | |||
$xml_parser = xml_parser_create(); | |||
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0); | |||
xml_set_processing_instruction_handler($xml_parser, "PIHandler"); | |||
xml_set_element_handler($xml_parser, "startElement", "endElement"); | |||
xml_set_character_data_handler($xml_parser, "characterData"); | |||
xml_set_default_handler($xml_parser, "defaultHandler"); | |||
xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); | |||
if (!($fp = @fopen($file, "r"))) { | |||
return false; | |||
} | |||
if (!is_array($parser_file)) { | |||
settype($parser_file, "array"); | |||
} | |||
$parser_file[$xml_parser] = $file; | |||
return array($xml_parser, $fp); | |||
} | |||
if (!(list($xml_parser, $fp) = new_xml_parser($file))) { | |||
die("could not open XML input"); | |||
} | |||
//ERROR | |||
while ($data = fread($fp, 4096)) { | |||
if (!xml_parse($xml_parser, $data, feof($fp))) { | |||
die(sprintf("XML error: %s at line %d\n", | |||
xml_error_string(xml_get_error_code($xml_parser)), | |||
xml_get_current_line_number($xml_parser))); | |||
} | |||
} | |||
//END | |||
xml_parser_free($xml_parser); | |||
</nowiki></pre> | |||
|} |
edits