Home > php教程 > php手册 > PHP操作XML功能齐全的xml操作类

PHP操作XML功能齐全的xml操作类

WBOY
Release: 2016-06-13 10:39:24
Original
939 people have browsed it

编程之家提供一个功能齐全的xml操作类



/* xml操作类 */
class operXml
{
    var $parser;

    public function __construct()
    {
        $this->parser = xml_parser_create();
        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);

        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
    }

    public function parse($xmlStr="",$endtag=true)
    {
     $this->endtag = $endtag;
     $this->xmlStr = $xmlStr;
     $this->tree = new stdClass;
     $this->tree->tag = "root";
     $this->tree->props = new stdClass;
     $this->tree->children = array();
     $this->tree->p = NULL;
     $this->tree->level = -1;
     $this->deep = 0;
     $this->pList = array($this->tree);
     xml_parse($this->parser, $this->xmlStr);
    if(count($this->tree->children)>0)
        $this->root = $this->tree->children[0];
    else
       $this->root = NULL;
    return $this;
   }

   public function tag_open($parser, $tag, $attributes)
   {
  $o = new stdClass;
  $o->p = $this->pList[$this->deep];
  $o->index = count($o->p->children);
  $o->level = $o->p->level 1;
  $o->tag = $tag;
  $o->props = new stdClass;
  while(list($key,$value)=each($attributes))
  $o->props->{$key} = $value;
  $o->value = "";
  $o->children = array();
  array_push($o->p->children,$o);
  $this->deep ;
  $this->pList[$this->deep] = $o;
    }

    public function cdata($parser, $cdata)
    {
        $this->pList[$this->deep]->value = $cdata;
    }

    public function tag_close($parser, $tag)
    {
  $this->deep--;
    }
 
 public function getNodeByProp() // 根据属性名称和值取得节点,
 {       // 参数:属性名称,属性值1,属性值2,属性值3,...
  $args = func_get_args();
  $node = $this->tree;
  for($i=1;$i  {
   $node = $this->_getNodeByProp($node,$args[0],$args[$i]);
   if($node==NULL) break;
  }
  return $node;
 }
 
 public function getChildByTag($node,$tag)  // 取得$node节点下标签为$tag的节点
 {
  for($i=0;$ichildren);$i )
  {
   if($node->children[$i]->tag==$tag)
    return $node->children[$i];
  }
  return NULL;
 }
 
 public function getChildsByTag($node,$tag) // 取得$node节点下标签为$tag的节点,返回节点列表数组
 {
  $rs = array();
  for($i=0;$ichildren);$i )
   if($node->children[$i]->tag==$tag)
    array_push($rs,$node->children[$i]);
  return $rs;
 }
 
 public function addRoot($tag)   // 添加根节点
 {
  $this->tree->children = array();
  $this->root = $this->addChild($this->tree,$tag);
  return $this->root;
 }
 
 public function addChild($node,$tag)  // 在$node节点下添加标签为$tag的节点,并返回添加的节点
 {
  $o = new stdClass;
  $o->p = $node;
  $o->level = $node->level 1;
  $o->index = count($node->children);
  $o->tag = $tag;
  $o->props = new stdClass;
  $o->value = "";
  $o->children = array();
  array_push($node->children,$o);
  return $o;
 }
 
 public function delete($node)  // 删除$node节点
 {
  $p = $node->p;
  array_splice($p->children,$node->index,1);
  for($i=0;$ichildren);$i )
   $p->children[$i]->index = $i;
 }
 
 public function move($dstNode,$srcNode) // 将srcNode移动到$dstNode下面
 {
  $this->delete($srcNode);
  $srcNode->p = $dstNode;
  $srcNode->level = $dstNode->level 1;
  $srcNode->index = count($dstNode->children);
  array_push($dstNode->children,$srcNode);
 }
 
 public function __toString()  // 返回xml格式串
 {
  $s = "";
  for($i=0;$itree->children);$i )
   $s .= $this->traversalNodeToXml($this->tree->children[$i],$this->endtag);
  return $s;
 }

 public function save($xmlFile)  // 保存成xml格式文件
 {
  $content = $this->__toString();
  
  $fp = @fopen($xmlFile,"w") or die("创建文件失败:".$xmlFile);
  @fwrite($fp,$content);
  @fclose($fp);
  @chmod($xmlFile,0777);
 }
 
 private function traversalNodeToXml($treeNode,$endtag)
 {
  $space = "";
  $space = str_pad($s,$treeNode->level*2," ",STR_PAD_LEFT);
  $s = $space."tag;
  while(list($key,$value)=each($treeNode->props))
   $s .= " $key="$value"";
  $childCount = count($treeNode->children);
  if($childCount==0)
  {
   if($treeNode->value!="" || $endtag)
    $s .= ">".$treeNode->value."".$treeNode->tag."> ";
   else
    $s .= "/> ";
   return $s;
  }
  
  $s .= "> ";
  for($i=0;$i   $s .= $this->traversalNodeToXml($treeNode->children[$i],$endtag);
  $s .= $space."".$treeNode->tag."> ";
  return $s;
 }
 
 private function _getNodeByProp($node,$propName,$propValue)
 {
  for($i=0;$ichildren);$i )
  {
   $anode = $node->children[$i];
   if(isset($anode->props) && isset($anode->

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template