日期:2013-04-14  浏览次数:20487 次

//原创,可以自由使用,欢迎提出改进意见,

<?PHP
//xml中的元素
class XMLTag
{
 var $parent;//父节点
 var $child;//子节点
 var $attribute;//本节点属性
 var $data;//本节点数据
 var $TagName;//本节点名称
 var $depth;//本节点的深度,根节点为1
 function XMLTag($tag='')
 {
  $this->attribute = array();
  $this->child = array();
  $this->depth = 0;
  $this->parent = null;
  $this->data = '';
  $this->TagName = $tag;
 }
 function SetTagName($tag)
 {
  $this->TagName = $tag;
 }
 function SetParent(&$parent)
 {
  $this->parent = &$parent;
 }
 function SetAttribute($name,$value)
 {
  $this->attribute[$name] = $value;
 }
 function AppendChild(&$child)
 {
  $i = count($this->child);
  $this->child[$i] = &$child;
 }
 function SetData($data)
 {
  $this->data= $data;
 }
 function GetAttr()
 {
  return $this->attribute;
 }
 function GetProperty($name)
 {
  return $this->attribute[$name];
 }
 function GetData()
 {
  return $this->data;
 }
 function GetParent()
 {
  return $this->parent;
 }
 function GetChild()
 {
  return $this->child;
 }
 function GetChildByName($name)
 {
  $total = count($this->child);
  for($i=0;$i<$total;$i++)
  {
   if($this->child[$i]->attribute['name'] == $name)
   {
    return $this->child[$i];
   }
  }
  return null;
 }
 //获取某个tag节点
    function GetElementsByTagName($tag)
    {
     $vector = array();
     $tree = &$this;
     $this->_GetElementByTagName($tree,$tag,$vector);
     return $vector;
    }
    function _GetElementByTagName($tree,$tag,&$vector)
    {
     if($tree->TagName == $tag) array_push($vector,$tree);
     $total = count($tree->child);
     for($i = 0; $i < $total;$i++)
      $this->_GetElementByTagName($tree->child[$i],$tag,$vector);
    }
}
//xml文档解析
class XMLDoc
{
 var $parser;//xml解析指针
 var $XMLTree;//生成的xml树
 var $XMLFile;//将要解析的xml文档
 var $XMLData;//将要解析的xml数据
 var $error;//错误信息
 var $NowTag;//当前指向的节点
 var $TreeData;//遍历生成的xml树等到的数据
 var $MaxDepth;//本树最大的深度
 var $encode;//xml文档的编码方式
 var $chs;//字符转换
 function XMLDoc()
 {
  //采用默认的ISO-8859-1
  $this->parser = xml_parser_create();
  xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
  xml_set_object($this->parser,&$this);
  xml_set_element_handler($this->parser,'_StartElement','_EndElement');
  xml_set_character_data_handler($this->parser,'_CData');
  $this->stack = array();
  $this->XMLTree = null;
  $this->NowTag = null;
  $this->MaxDepth = 0;
 }
 function LoadFromFile($file)
 {
  $this->XMLFile = fopen($file,'r');
  if(!$this->XMLFile)
  {
   $this->error = '不能打开xml文件';
   return false;
  }
  $this->XMLData = '';
  $this->Tree