/** * 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(); } }