I am trying to parse an XML file and store the data in variables. I wrote code that is able to run but is giving me invalid results. I have been trying to debug it, but I haven't been able to see why it is giving wrong results.
Here is my xml code:
espada.xml
<?xml version="1.0"?>
<!DOCTYPE espadas [
<!ELEMENT espadas (espada+)>
<!ELEMENT espada (name, rank, resurreccion)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT rank (#PCDATA)>
<!ELEMENT resurreccion (release-command, zan-name)>
<!ELEMENT release-command (#PCDATA)>
<!ELEMENT zan-name (#PCDATA)>
]>
<espadas>
<espada>
<name>Coyote Starrk</name>
<rank>Primera</rank>
<resurreccion>
<release-command>Kick About</release-command>
<zan-name>Los Lobos</zan-name>
</resurreccion>
</espada>
<espada>
<name>Baraggan Louisenbairn</name>
<rank>Segunda</rank>
<resurreccion>
<release-command>Rot</release-command>
<zan-name>Arrogante</zan-name>
</resurreccion>
</espada>
<espada>
<name>Tier Harribel</name>
<rank>Tres</rank>
<resurreccion>
<release-command>Destroy</release-command>
<zan-name>Tiburon</zan-name>
</resurreccion>
</espada>
<espada>
<name>Ulquiorra Cifer</name>
<rank>Cuatro</rank>
<resurreccion>
<release-command>Enclose</release-command>
<zan-name>Murcielago</zan-name>
</resurreccion>
</espada>
<espada>
<name>Nnoitra Gilga</name>
<rank>Quinto</rank>
<resurreccion>
<release-command>Pray</release-command>
<zan-name>Santa Teresa</zan-name>
</resurreccion>
</espada>
<espada>
<name>Grimmjow Jaegerjaquez</name>
<rank>Sexta</rank>
<resurreccion>
<release-command>Grind</release-command>
<zan-name>Pantera</zan-name>
</resurreccion>
</espada>
<espada>
<name>Zommari Rureaux</name>
<rank>Septima</rank>
<resurreccion>
<release-command>Suppress</release-command>
<zan-name>Brujeria</zan-name>
</resurreccion>
</espada>
<espada>
<name>Szayelaporro Granz</name>
<rank>Octava</rank>
<resurreccion>
<release-command>Sip</release-command>
<zan-name>Fornicaras</zan-name>
</resurreccion>
</espada>
<espada>
<name>Aaroniero Arruruerie</name>
<rank>Noveno</rank>
<resurreccion>
<release-command>Devour</release-command>
<zan-name>Glotoneria</zan-name>
</resurreccion>
</espada>
<espada>
<name>Yammy Llargo</name>
<rank>Diez/Cero</rank>
<resurreccion>
<release-command>Be Enraged</release-command>
<zan-name>Ira</zan-name>
</resurreccion>
</espada>
</espadas>
and here is my php code:
index.php
<?php
class Espada {
private $name;
private $rank;
private $resurreccion;
public function __construct() {}
public function set($field, $value) {
if(!is_string($value) && !$value instanceof Resurreccion) {
die('Error: Invalid Argument.');
}
if(strcasecmp($field, "name")) {
$this->name = $value;
}
if(strcasecmp($field, "rank")) {
$this->name = $value;
}
if(strcasecmp($field, "resurreccion")) {
$this->name = $value;
}
}
public function __toString() {
return "Espada:<br>\tName: $this->name.<br>\tRank: $this->rank Espada.<br>\t$this->resurreccion";
}
}
class Resurreccion {
private $release_command;
private $name;
public function __construct() {}
public function set($field, $value) {
if(!is_string($value)) {
die('Error: Invalid Argument.');
}
if(strcasecmp($field, "release-command") == 0) {
$this->release_command = $value;
}
if(strcasecmp($field, "zan-name")) {
$this->name = $value;
}
}
public function __toString() {
return "\tResurreccion:<br>\t\tRelease Command: $this->release_command.<br>\t\tName: $this->name.";
}
}
$file = "espada.xml";
function start_element_handler($parser, $name) {
// echo "<<font color=\"#f14c38\">$name</font>>";
// echo "<font color=\"#ff0000\">__START__: \"$name\"</font>";
if(strcasecmp($name, "espadas") == 0) {
global $espadas;
$espadas = array();
} elseif(strcasecmp($name, "espada") == 0) {
global $curr_esp;
$curr_esp = new Espada();
} elseif(strcasecmp($name, "resurreccion") == 0) {
global $curr_res;
$curr_res = new Resurreccion();
} else { // not espadas, espada, or resurreccion
global $curr_tag;
$curr_tag = $name;
}
}
function end_element_handler($parser, $name) {
// echo "</<font color=\"#f14c38\">$name</font>>";
// echo "<font color=\"#ff0000\">__END__: \"$name\"</font>";
if(strcasecmp($name, "espadas") == 0) {
global $espadas;
foreach($espadas as $espada) {
echo $espada . "<br>";
}
} elseif(strcasecmp($name, "espada") == 0) {
global $espadas;
global $curr_esp;
$espadas[] = $curr_esp;
} elseif(strcasecmp($name, "resurreccion") == 0) {
global $curr_esp;
global $curr_res;
$curr_esp->set("resurreccion", $curr_res);
} else { // not espadas, espada, or resurreccion
// do nothing
}
}
function character_data_handler($parser, $data) {
// echo "<b><font color=\"#4c38f1\">$data</font></b>";
// echo "<font color=\"#0000ff\">__DATA__: \"$data\"</font>";
global $curr_esp;
global $curr_res;
global $curr_tag;
if(preg_match("/^\s*$/", $data) === 0) {
if(isset($curr_res)) {
$curr_res->set($curr_tag, $data);
} else {
$curr_esp->set($curr_tag, $data);
}
}
}
function new_xml_parser($file) {
global $parser_file;
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
xml_set_element_handler($xml_parser, "start_element_handler", "end_element_handler");
xml_set_character_data_handler($xml_parser, "character_data_handler");
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.');
}
echo "<pre>";
while($data = fread($fp, 4096)) {
if(!xml_parse($xml_parser, $data, feof($fp))) {
die("XML error: " . xml_error_string(xml_get_error_code($xml_parser)) . " at line " . xml_get_current_line_number($xml_parser) . "<br>");
}
}
echo "</pre>";
echo "parsing complete";
xml_parser_free($xml_parser);
and here is the result I'm getting:
Espada:
Name: Resurreccion:
Release Command: Kick About.
Name: Segunda..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Rot.
Name: Tres..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Destroy.
Name: Cuatro..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Enclose.
Name: Quinto..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Pray.
Name: Sexta..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Grind.
Name: Septima..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Suppress.
Name: Octava..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Sip.
Name: Noveno..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Devour.
Name: Diez/Cero..
Rank: Espada.
Espada:
Name: Resurreccion:
Release Command: Be Enraged.
Name: Be Enraged..
Rank: Espada.
But what I should be getting is
Espada:
Name: Coyotte Starrk.
Rank: Primera Espada.
Resurreccion:
Release Command: Kick About.
Name: Los Lobos
Espada:
....
Could anyone help me know why it is giving me wrong results?
Sorry for the long post.
No comments:
Post a Comment