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