PDA

View Full Version : xml parse



yasercomeng
سه شنبه 03 دی 1387, 16:45 عصر
سلام به دوستان عزيز.
من براي Parse كردن اين فايل xml به مشكل برخوردم. اگه ممكنه منو تو parse كردن اين فايل راهنمايي كنيد.


<?xml version="1.0" encoding="ISO-8859-1"?>




<Config>

<ConnectionString>
<Server>
<Name>servername</Name>
<IP>172.16.20.21</IP>
</Server>
</ConnectionString>
<Grants>
<Grant ID=0>
<UID>admin</UID>
<PWD>2fac4j930ljgcas9312fsdf0</PWD>
</Grant>
<Grant ID=1>
<UID>reviewer</UID>
<PWD>2fac4j930ljgcas9312fsdf3</PWD>
</Grant>
<Grant ID=2>
<UID>member</UID>
<PWD>2fac4j930ljgcas9312fsdfs</PWD>
</Grant>
<Grant ID=3>
<UID>user</UID>
<PWD>2fac4j930ljgcas9312fsdfa</PWD>
</Grant>
</Grants>
</Config>




البته من براي parse اين فايل يك كلاس نوشتم اما نمي دونم چرا كلاسم درست كار نمي كنه من كد كلاسي كه براي parse اين فايل نوشتم رو هم ضميمه كردم.اگر ممكن است منو تو رفع اين اشكال راهنمايي كنيد.

کلاسی که برای parse نوشتم:

<?php





include_once('Hash.php');

class XMLHandler
{
private $CurrentGrantID;
private $ParserHandler;
private $HashHandler;
private $Current;
private $XMLPath;
public $ErrorNumber;
public $Server;
public $Grant;
/*
$ErrorNumber=0 XML file has a valid format
$ErrorNumber=1 XML file is in invalid format
*/
public function __construct($XMLPath="config.xml")
{
$this->ParserHandler=xml_parser_create();
$this->HashHandler=new hash_encryption("M!Y!M");
$this->XMLPath=$XMLPath;
}
private function StartElement($Parser,$ElementName,$ElementAttribut e)
{
if($ElementName=="CONNECTIONSTRING")
{
$this->ErrorNumber=0;
}
else if($ElementName=="SERVER")
{
$this->ErrorNumber=0;
}
else if($ElementName=="NAME")
{
$this->ErrorNumber=0;
$this->Current[0]="NAME";
}
else if($ElementName=="IP")
{
$this->ErrorNumber=0;
$this->Current[0]="IP";
}
else if($ElementName=="GRANTS")
{
$this->ErrorNumber=0;
}
else if($ElementName=="GRANT")
{
if(is_array($ElementAttribute))
{
$this->ErrorNumber=0;
$this->CurrentGrantID=$ElementAttribute['ID'];
$this->Grant[$this->CurrentGrantID]["UID"]="";
$this->Grant[$this->CurrentGrantID]["PWD"]="";
}
else
$this->ErrorNumber=1;
}
else if($ElementName=="UID")
{
$this->ErrorNumber=0;
}
else if($ElementName=="PWD")
{
$this->ErrorNumber=0;
}
else
{
$this->ErrorNumber=1;
return;
}
}
private function EndElement($Parser,$ElementName)
{
if($ElementName=="CONNECTIONSTRING")
{
$this->ErrorNumber=0;
}
else if($ElementName=="SERVER")
{
$this->ErrorNumber=0;
}
else if($ElementName=="NAME")
{
$this->ErrorNumber=0;
}
else if($ElementName=="IP")
{
$this->ErrorNumber=0;
}
else if($ElementName=="GRANTS")
{
$this->ErrorNumber=0;
}
else if($ElementName=="GRANT")
{
$this->ErrorNumber=0;
}
else if($ElementName=="UID")
{
$this->ErrorNumber=0;
}
else if($ElementName=="PWD")
{
$this->ErrorNumber=0;
}
else
{
$this->ErrorNumber=1;
return;
}
}
private function ElementValue($Parser,$Data)
{
if($this->Current=="NAME")
{
$this->ErrorNumber=0;
}
else if($ElementName=="IP")
{
$this->ErrorNumber=0;
}
else if($this->Current=="UID")
{
$this->ErrorNumber=0;
$this->Grant[$this->CurrentGrantID]["UID"]=$this->HashHandler->decrypt($Data);
}
else
{
$this->Grant[$this->CurrentGrantID]["PWD"]=$this->HashHandler->decrypt($Data);
$this->ErrorNumber=0;
}
}
private function SetElementHandler()
{
//xml_set_element_handler($this->ParserHandler,"StartElement","EndElement");
xml_set_element_handler($this->ParserHandler,$this->StartElement,$this->EndElement);
}
private function SetCharacterDataHandler()
{
xml_set_character_data_handler($this->ParserHandler,$this->ElementValue);
//xml_set_character_data_handler($this->ParserHandler,"ElementValue");
}
public function Parse()
{
$this->SetElementHandler();
$this->SetCharacterDataHandler();
$FileHandler=fopen($this->XMLPath,"r");
while ($Data=fread($FileHandler,4096))
{
try
{
xml_parse($this->ParserHandler,$Data,feof($FileHandler));
}
catch(Exception $e)
{
sprintf("XML Error: %s at line %d",xml_error_string(xml_get_error_code($parser)),xml _get_current_line_number($parser));
}
}
}
}
?>





کد برنامه ای که برای نمایش اطلاعات استفاده می کنم:


<?php





include('Hash.php');

include('XMLHandler.php');
$Instance=new XMLHandler();
$Instance->Parse();
echo 'Server Name:'.$Instance->Server["Name"].'<br />';
echo 'Server IP:'.$Instance->Server["IP"].'<br />';
echo 'Server Grant 0: User=>'.$Instance->Grant[0]["UID"].'&nbsp&nbspPass=>'.$Instance->Grant[0]["PWD"].'<br />';
echo 'Server Grant 1: User=>'.$Instance->Grant[1]["UID"].'&nbsp&nbspPass=>'.$Instance->Grant[1]["PWD"].'<br />';
echo 'Server Grant 2: User=>'.$Instance->Grant[2]["UID"].'&nbsp&nbspPass=>'.$Instance->Grant[2]["PWD"].'<br />';
echo 'Server Grant 3: User=>'.$Instance->Grant[3]["UID"].'&nbsp&nbspPass=>'.$Instance->Grant[3]["PWD"].'<br />';
?>




سؤال دومم هم اينه كه اگه من بخوام از كلاس DOMDocument براي Parse كردن اين فايل استفاده كنم، شيوه ي كار چه طوريه؟

yasercomeng
یک شنبه 15 دی 1387, 11:48 صبح
دوباره سلام. من ساختار فایل XML خودمو درست کردم. اما همچنان با طراحی کلاسم مشکل دارم.
اگه من همین برنامه و متد ها رو تو خارج از کلاسم بذارم همه چی درسته اما تو کلاس متدهای callback ای که برای StartElement و EndElement و ElementValue استفاده می شن به درستی کار نمی کنن. من کد رو دوباره قرار می دم.خواهشن کمکم کنید.