Home  >  Article  >  Backend Development  >  PHP operates XML with full-featured xml operation class_PHP tutorial

PHP operates XML with full-featured xml operation class_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 17:40:53722browse

编程之家提供一个功能齐全的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() // According to Attribute name and value get the node,
{          // Parameters: attribute name, attribute value 1, attribute value 2, attribute value 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) // Get the node labeled $tag under the $node node
{
for($i=0;$ichildren);$i )
{
if($node->children[$i]->tag==$tag)
return $node->children[$i];
}
return NULL;
}

public function getChildsByTag($node,$tag) // Get the node with the tag $tag under the $node node and return the node list array
{
$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) // Add root node
{
$this->tree->children = array();
$this->root = $this->addChild($this->tree,$ tag);
return $this->root;
}

public function addChild($node,$tag) // Add a node with the tag $tag under the $node node, and Return the added node
{
$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) // 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) // Move srcNode below $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() // Return xml format string
{
$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."<".$treeNode->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."tag."> ";
   else
    $s .= "/> ";
   return $s;
  }
  
  $s .= "> ";
  for($i=0;$i<$childCount;$i )
   $s .= $this->traversalNodeToXml($treeNode->children[$i],$endtag);
  $s .= $space."tag."> ";
  return $s;
 }
 
 private function _getNodeByProp($node,$propName,$propValue)
 {
  for($i=0;$ichildren);$i )
  {
   $anode = $node->children[$i];
   if(isset($anode->props) && isset($anode->

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/486173.htmlTechArticle编程之家提供一个功能齐全的xml操作类 ? /* xml操作类 */ class operXml { var $parser; public function __construct() { $this-parser = xml_parser_create(); xml_parser...
Statement:
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