http://alpha-thema-online.uv.ro
Fa-ti si tu propriul forum, pe www.myforum.ro!
Pagina de start a forumului http://alpha-thema-online.uv.ro Autentificare Inregistrare FAQ Membri Cautare

Pagina de start a forumului http://alpha-thema-online.uv.ro » Web development » Parser XML
Creaza un subiect nou  Raspunde la subiect Subiectul anterior :: Subiectul urmator 
Parser XML
MesajTrimis: 07/07/2007 21:20 Raspunde cu citat (quote)
CrIstY
Moderator
<font color=green>Moderator</font>
CrIstY
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>
Parser XML Parser XML[/URL]
Shot at 2007-07-06
Vezi profilul utilizatorului Trimite mesaj privat

Parser XML
MesajTrimis: 25/05/2009 15:15 Raspunde cu citat (quote)
MagicOPromotion
New Guy
New Guy
MagicOPromotion
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
Vezi profilul utilizatorului Trimite mesaj privat Trimite un mesaj

Parser XML
 Pagina de start a forumului http://alpha-thema-online.uv.ro » Web development
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Ora este GMT + 3 ore  
Pagina 1 din 1  

  
  
 Creaza un subiect nou  Raspunde la subiect  


Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
    Powered by phpBB © 2001-2004 phpBB Group. phpBB Skin by Vjacheslav Trushkin.