XML操作类

/**
 * nodename :选取所有子节点
 * /		:从根节点选取
 * //		:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
 * . 		:选取当前节点
 * ..		:选取当前节点的父节点
 * @		:选取属性
 *
 * 
 * //book 	:选取所有book子元素
 * //title[@lang='eng']		:选取所有title元素,且这些元素拥有值为eng的lang属性
 * //book[price>35.00]		:选取所有book元素,且其price元素的值需大于35.00
 */
class XML{
	private $dom;
    private $xmlfile;
	private $xpath;
    
	/**
     * @brief 构造函数
     * @param string $xmlfile xml文件名 如果文件名不填写[即为空],则保存时必需填写文件名。
     * @param string $encoding 文件的编码格式,默认为UTF-8编码
     */
	public function __construct($params = array()){
		$keys = array_keys($params);
		if(!in_array('encoding',$keys)){
			$params['encoding'] = "utf-8";
		}
		$this->dom=new DOMDocument('1.0');
		$this->rootNode = $this->dom->appendChild($this->dom->createElement($params['rootNode']));
		$this->dom->formatOutput=true;
		$this->dom->encoding = $params['encoding'];
        if(in_array('xmlfile',$keys) && $params['xmlfile']!='' && strtolower(substr($params['xmlfile'],-4))=='.xml'){
			$this->xmlfile = $params['xmlfile'];
		}
		$this->xpath=new DOMXpath($this->dom);
	}
	
    /**
     * @brief 查询节点函数
     * @param string $query xpath查询字符串
     * @return mixed 查询成功返回节点,失败返回false;
     */
	public function query($query)
	{
		$element = $this->xpath->query($query);
		if($element->length>0){
			return $element;
		}else{
			return false;
		}
	}
	
	
	
	public function setStylesheet($value)
	{
		$this->dom->appendChild($this->dom->createProcessingInstruction('xml-stylesheet', 'href="'.$value.'" type="text/xsl"'));
	}
	/**
     * @brief 添加节点
	 * @param string $query xpath查询字符串
	 * @param string $name 节点名称
	 * @param string $value 节点值
	 * @param string $attrs 属性值,可以设置多个属性,如:name=web;age=12;class=高二
	 * @return bool 成功返回true,失败返回false
	 */
	public function addNode($query, $name, $value="", $attrs=""){
		$target_node=$this->query($query);
		if(is_string($name)){
			if($target_node){
				$value = str_replace(
					array('>','<','&'),
					array('>','<','&'),
					$value
				);
				$node=$this->dom->createElement($name,$value);
				if($attrs!=""){
					$tems=explode(";",$attrs);
					if(count($tems)>0){
						for($i=0;$i<count($tems);$i++){
							$tem=explode("=",$tems[$i]);
							$node->setAttribute($tem[0],$tem[1]);
						}
					}
				}
				$target_node->item(0)->appendChild($node);
				return true;
			}
			else
			{
				return false;
			}
		}else{
			$target_node->item(0)->appendChild($name);
		}
	}
	/**
     * @brief 给节点添加属性
	 * @param string $query xpath查询字符串
	 * @param string $name 属性名称
	 * @param string $value 属性值
	 * @return bool 成功返回true,失败返回false
	 */
	public function addAttr($query, $name, $value)
	{
		$node=$this->query($query);
		if($node)
		{
            for($i=0; $i<$node->length; $i++) $node->item($i)->setAttribute($name,$value);
			return true;
		}
		else
		{
			return false;
		}
	}
	/**
     * @brief 删除节点
	 * @param string $query xpath查询字符串
	 * @return bool 成功返回true,失败返回false
	 */
	function delNode($query)
	{
		$node=$this->query($query);
		if($node)
		{
			$node->item(0)->parentNode->removeChild($node->item(0));
			return true;
		}
		else
		{
			return false;
		}
	}
	/**
     * @brief 删除一个节点的属性
	 * @param string $query xpath查询字符串
	 * @param string $name 属性名称
	 * @return bool 成功返回true,失败返回false
	 */
	function delAttr($query, $name)
	{
		$node=$this->query($query);
		if($node)
		{
			$node->item(0)->removeAttribute($name);
			return true;
		}
		else
		{
			return false;
		}
	}
	/**
     * @brief 修改节点属性
	 * @param string $query xpath查询字符串
	 * @param string $name 属性名称
	 * @param string $value 属性值
	 * @return bool 成功返回true,失败返回false
	 */
	public function updAttr($query, $name, $value)
	{
		$node=$this->query($query);
		if($node)
		{
			$node->item(0)->setAttribute($name,$value);
			return true;
		}
		else
		{
			return false;
		}
	}
	/**
     * @brief 修改节点的值
	 * @param string $query xpath查询字符串
	 * @param string $value 属性值
	 * @return bool 成功返回true,失败返回false
	 */
	public function updNode($query, $value)
	{
		$node=$this->query($query);
		if($node)
		{
			$node->item(0)->nodeValue=$value;
			return true;
		}
		else
		{
			return false;
		}
	}
	/**
     * @brief 保存XML文档
	 * @param string $file XML文件名,不填写则默认以创建此类文件时的文件名来存储。
	 * @return mixed 成功返回写入的字节, 失败返回false
	 */
	public function save1($file='')
	{
        if($file=='' && $this->xmlfile!='')$file = $this->xmlfile;
		$this->dom->save($file);
	}
    /**
     * @brief 转换成XML字符串
     * @return String
     */
	public function  save(){
		return $this->dom->saveXML();
	}
}
原文地址:https://www.cnblogs.com/liwuming/p/4494231.html