 |
|
 |
 | Parser XML |  |
Trimis: 07/07/2007 21:20 |
|
|
| CrIstY |
| Moderator |

 |
 |
| Data inscrierii: 06/Iul/2007 |
| Mesaje: 7 |
|
|
|
 |
 |
 |
|
Nu demult a trebuit sa parsez un XML gen exemplul de mai jos. Cumplit de usor am constatat ca functiile de parsare a PHP nu ma pot ajuta prea mult, si a trebuit sa-mi construiesc propriul parser.
Structura XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ADI>
<Asset>
<Asset>
<Metadata>
<AMS Provider="InDemand" Product="MOD" Asset_Name="The_Titanic.mpg" Version_Major="1" Version_Minor="0" Description="The Titanic Movie" Creation_Date="2002-01-11"/>
<App_Data App="MOD" Name="Copy_Protection" Value="N"/>
<App_Data App="MOD" Name="Content_FileSize" Value="3907840625"/>
<App_Data App="MOD" Name="Content_CheckSum" Value="12558D3269D25852BD26548DC2654CA"/>
</Metadata>
<Content Value="The_Titanic.mpg"/>
</Asset>
<Asset>
<Metadata>
<AMS Provider="InDemand" Product="MOD" Asset_Name="The_Titanic_Preview.mpg" Version_Major="1" Version_Minor="0" Description="The Titanic Preview" Creation_Date="2002-01-11"/>
<App_Data App="MOD" Name="Rating" Value="G"/>
<App_Data App="MOD" Name="Content_CheckSum" Value="A1258D3269D25852BD26548DC2654C1"/>
</Metadata>
<Content Value="The_Titanic_Preview.mpg"/>
</Asset>
<Asset>
<Metadata>
<AMS Provider="InDemand" Product="MOD" Asset_Name="The_Titanic_Box_Cover.bmp" Version_Major="1" Version_Minor="0" Description="The Titanic Box Cover" Creation_Date="2002-01-11"/>
<App_Data App="MOD" Name="Type" Value="box cover"/>
<App_Data App="MOD" Name="Content_CheckSum" Value="B3258D3269D25852BD26548DC2654CD"/>
</Metadata>
<Content Value="The_Titanic_Box_Cover.bmp"/>
</Asset>
</Asset>
</ADI>
Aceasta structura XML este compatibila cu standardele CableLabs.
<?php
/*
XML Parser Class (php5)
Parseaza un document XML asemanator cu extensia SimpleXML.
*/
class XMLParser
{
/**
* Variabila XML parser
* @var resource
*/
private $parser;
/**
* documentul XML
* @var string
*/
private $xml;
/**
* tag-ul Documentului
*
* @var object
*/
public $document;
/**
* adancimea curenta(stiva)
*
* @var array
*/
private $stack;
/**
* Constructor. Incarca documentul XMl.
*
* @param string $xml continutul fisierului XML
* @return XMLParser
*/
function __construct($xml = '')
{
$this->xml = $xml;
$this->stack = array();
}
/**
* Instantiaza si ruleaza parserul XML al PHP
*/
public function Parse()
{
$this->parser = xml_parser_create();
xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, 'StartElement', 'EndElement');
xml_set_character_data_handler($this->parser, 'CharacterData');
if (!xml_parse($this->parser, $this->xml))
$this->HandleError(xml_get_error_code($this->parser), xml_get_current_line_number($this->parser), xml_get_current_column_number($this->parser));
xml_parser_free($this->parser);
}
/**
* Trateaza erorile de parsare a XML
*
* @param int $code XML Error Code
* @param int $line Linia la care a avut loc eroarea
* @param int $col Coloana la care a avut loc eroarea
*/
private function HandleError($code, $line, $col)
{
trigger_error('XML Parsing Error at '.$line.':'.$col.'. Error '.$code.': '.xml_error_string($code));
}
/**
* ia referinta catre parintele direct curent
*
* @return object
*/
private function GetStackLocation()
{
//returneaza referinta catre parintele direct curent
$return = &end($this->stack);
return $return;
}
/**
* functia ce se ocupa cu inceputul unui tag
*
* @param resource $parser
* @param string $name
* @param array $attrs
*/
private function StartElement($parser, $name, $attrs = array())
{
$name = strtolower($name);
//verifica daca tagul este de nivel primar(nu are parinte)
if (count($this->stack) == 0)
{
//seteaza document ca tag curent
$this->document = new XMLTag($name, $attrs);
$this->stack = array(&$this->document);
}
//folosim stiva pentru a afla parintele
else
{
// ia referinta catre parintele direct curent
$parent = $this->GetStackLocation();
$parent->AddChild($name, $attrs, count($this->stack));
$this->stack[] = &end($parent->$name);
}
}
/**
* functia ce se ocupa cu sfarsitul unui tag
*
* @param resource $parser
* @param string $name
*/
private function EndElement($parser, $name)
{
//sterge ultima valoare din stiva ca parinte
array_pop($this->stack);
}
/**
* functia ce se ocupa cu datele dintr-un tag
*
* @param resource $parser
* @param string $data
*/
private function CharacterData($parser, $data)
{
//ia referinta din obiectul parinte curent
$tag = $this->GetStackLocation();
//se atribuie date
$tag->tagData .= trim($data);
}
}
/**
* XML Tag Object (php5)
*
* Acest obiect retine toti copiii lui directi in vectorul $children.
* De asemenea acestia sunt stocati dupa tip ca si vectori.
*/
class XMLTag
{
/**
* Vectorul cu atributele tagului XML
*
* @var array
*/
public $tagAttrs;
/**
* Numele tagului
*
* @var string
*/
public $tagName;
/**
* Datele continute de tag
*
*
* @var stat
*/
public $tagData;
/**
* Vectorul cu referintele catre toate obiectele copiilor directi
* ale acestui obiect XML
*
* @var array
*/
public $tagChildren;
/**
* Numarul de parinti ai obiectului XML
* @var int
*/
public $tagParents;
/**
* Constructor
*
* @param string $name
* @param array $attrs
* @param int $parents
* @return XMLTag
*/
function __construct($name, $attrs = array(), $parents = 0)
{
$this->tagAttrs = array_change_key_case($attrs, CASE_LOWER);
$this->tagName = strtolower($name);
$this->tagParents = $parents;
$this->tagChildren = array();
$this->tagData = '';
}
/**
* Adauga un copil direct obiectului
*
* @param string $name
* @param array $attrs
* @param int $parents
*/
public function AddChild($name, $attrs, $parents)
{
if(!isset($this->$name))
$this->$name = array();
//daca tagul are acelasi nume cu un membru din XMLTag, sau cumva vectorul nu a fost făcut bine, returneaza o eroare cu mult mai numeroase informatii fata de erorile naturale ale PHP
if(!is_array($this->$name))
{
trigger_error('You have used a reserved name as the name of an XML tag. Please rename the tag named '.$name.' to something other than a reserved name.', E_USER_ERROR);
return;
}
$child = new XMLTag($name, $attrs, $parents);
$this->{$name}[] = &$child;
$this->tagChildren[] = &$child;
}
}
?>
Mod de utilizare:
$xml = file_get_contents(file.xml'); //fisierul xml
$parser = new XMLParser($xml);
$parser->parse();
echo "<pre>";
print_r($parser);
echo "</pre>";
Deoarece vectorul este suficient de stufos va recomand crearea unei clase pentru a customiza vectorul in vederea fololsirii sale.
Made by madaeroblade |
|
_________________ "Remember my name... You'll be screaming it later!!" <a href="http://no-coment.ro">My Site </a>
[/URL]
Shot at 2007-07-06 |
|
|
|
 | Parser XML |  |
Trimis: 25/05/2009 15:15 |
|
|
| MagicOPromotion |
| New Guy |

 |
 |
| Data inscrierii: 02/Mai/2009 |
| Mesaje: 2 |
| Localitate: England |
|
|
 |
 |
 |
|
Hello
I have created an XML File with an root and in it 12 "rows".
Now I wish to bind that Data to my combo box design time so when the user press on the combo box he would be able to see those 12 rows.
How do I do it? |
|
_________________ XRumer 5.0 Palladium: best promotion software |
|
|
|
|
|
Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
|
|