php中操作xml文档程序代码

 更新时间:2016年11月25日 16:54  点击:1744
下面我先是介绍一个朋友自己写的一个操作xml文档程序,然后再介绍了php中一个自带的解析xml文档的函数功能,有需要的朋友可参考。
 代码如下 复制代码

 

/*
<?xml version="1.0" encoding="UTF-8"?>
<班级>
<学生 number="101">
<名字>孙悟空</名字>
<名字>孙行者</名字>
<年龄>猴精猴精</年龄>
<介绍></介绍>
</学生>
<学生 number="102">
<名字>白骨精</名字>
<年龄>140</年龄>
<介绍>幻化万千</介绍>
</学生>
<学生 number="103">
<名字>猪八戒</名字>
<名字>猪无能</名字>
<年龄>200</年龄>
<介绍>能吃会睡</介绍>
</学生>
</班级>
*/

class xmlDom{
    public $version;
    public $encoding;
    private $xml;
    private $items;
    private $seachNode = '';
    private $seachItem = '';
    private $seachValue = '';
    public $writeBytes = 0;

    function __construct($xmlFile ='', $version ='1.0', $encoding = 'UTF-8'){
        $this->version = $version;
        $this->encoding = $encoding;
        $this->xml = new DOMDocument($version, $encoding);
        if($xmlFile)$this->xml->load($xmlFile);
    }
    function getRootEle($rootTag){
        $this->xmlRoot = $this->xml->getElementsByTagName($rootTag)->item(0);
    }
    function getSeachItem($itemsTag, $seachNode, $seachValue){
        $this->items = $this->xml->getElementsByTagName($itemsTag);
        $this->items->length;
        for($i=0; $i<$this->items->length; $i++){
            $item = $this->items->item($i);//元素
            $node = $item->getElementsByTagName($seachNode);//节点
            for($j = 0; $j< $node->length; $j++){
                $subNode = $node->item($j);
                if($seachValue == $subNode->nodeValue){
                    $this->seachNode = $subNode;
                    $this->seachItem = $item;
                    $this->seachValue = $subNode->nodeValue;
                    break(2);
                }
            }
        }
        return ($this->seachNode) ? true : false;
    }
   
    function update($nodeValue, $nodeTag = '',$append = false, $index = 0){
        if($append){
            if($nodeTag)
                $this->seachItem->getElementsByTagName($nodeTag)->item($index)->nodeValue += $nodeValue;
            else
                $this->seachNode->nodeValue += $nodeValue;
        }else{
            if($nodeTag)
                $this->seachItem->getElementsByTagName($nodeTag)->item($index)->nodeValue = $nodeValue;
            else
                $this->seachNode->nodeValue = $nodeValue;
        }
    }
   
    function save($filename){
        $this->writeBytes = $this->xml->save($filename);
        return ($this->writeBytes) ? true : false;
    }
}

$test = new xmlDom('student.xml');
$test->getSeachItem('学生','年龄','103');//找到 年龄=103 的猪八戒
$test->update('小猪猪', '名字', false, 1); //把猪八戒的第二个名字改成:小猪猪
$test->save('new.xml'); //保存成新文件

上面是使用了dom来操作,下面我们利用php中的SimpleXML来操作xml,也算是很标准的一个操作xml文档的类了。

simplexml_load_file(string filename)
这里的 filename变量是用于存储 XML数据文件的文件名及其所在路径。以下代码使用 simplexml_load_file函数来创建了一个 SimpleXML对象。

 代码如下 复制代码

<?php
$xml = simplexml_load_file(’example.xml’); //创建 SimpleXML对象
print_r($xml);         //输出 XML
?>

其中,example.xml存储的数据与上面的$data完全相同,运行结果也与上面完全相同。
上面两种方法实现了同样的功能,其区别就在于 XML的数据源不同。如果 XML的数据源在 PHP脚本文件中,则需要使用 simplexml_load_string来进行创建。如果 XML的数据源在一个单独的 XML文件中,则需要使用 simplexml_load_file来进行创建。

读取 XML数据中的标签
与操作数组类型的变量类似,读取 XML也可以通过类似的方法来完成。例如,如果需要读取上面 XML数据中每一个“ depart”标签下的“name”属性,可以通过使用 foreach函数来完成,如以下代码
所示。

 代码如下 复制代码

<?php $xml = simplexml_load_file(’example.xml’); foreach($xml->depart as $a)
{
echo “$a->name <BR>”;
}
?>

运行结果如下所示。
production support
testing center
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签
//输出其中的 name属性
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。

 

 代码如下 复制代码
<?php
$xml = simplexml_load_file(’example.xml’); //读取 XML文件
echo $xml->depart->name[0]; //输出节点
?>

运行结果如下所示。
production support
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。

我们知道php中的simpleXML没办法直接很方便的添加CDATA格式的数据,这样对我们操作时会有一定的问题,下面我来给各位同学介绍php simpleXML添加CDATA格式数据一种办法。

代码

 代码如下 复制代码

<?php
/**
* to show <title lang="en"><![CDATA[Site Title]]></title>   instead of <title lang="en">Site Title</title>
*
*/
class SimpleXMLExtended extends SimpleXMLElement
  {
  public function addCData($cdata_text)
    {
    $node = dom_import_simplexml($this);
    $no   = $node->ownerDocument;
    $node->appendChild($no->createCDATASection($cdata_text));
    }
  }
$xmlFile    = 'config.xml';
// instead of $xml = new SimpleXMLElement('<sites/>');
$xml = new SimpleXMLExtended('<sites/>');
$site = $xml->addChild('site');
// instead of $site->addChild('site', 'Site Title');
$site->title = NULL; // VERY IMPORTANT! We need a node where to append
$site->title->addCData('Site Title');
$site->title->addAttribute('lang', 'en');
$xml->asXML($xmlFile);
?>

DOMDocument这个功能是我们php中自带的一个功能,下面我来介绍利用DOMDocument生成xml文档,并且也介绍DOMDocument解析xml文件的方法,有需要的朋友可参考。

数组

 代码如下 复制代码

$arr[] = array(

'name' => $row['name'],

'sex' => $row['sex'],

'age' => $row['age']

);

生成php

 代码如下 复制代码

$doc = new DOMDocument('1.0', 'utf-8'); // 声明版本和编码

$doc->formatOutput = true;
$r = $doc->createElement("root");

$doc->appendChild($r);
foreach ($arr as $dat) {

$b = $doc->createElement("data");
$name = $doc->createElement("name");

$name->appendChild($doc->createTextNode($dat['name']));

$b->appendChild($name);
$sex = $doc->createElement("sex");

$sex->appendChild($doc->createTextNode($dat['sex']));

$b->appendChild($sex);

$age = $doc->createElement("age");

$age->appendChild($doc->createTextNode($dat['age']));

$b->appendChild($age);

$r->appendChild($b);

}
echo $doc->saveXML();

这样就生成了一个xml文件了

解析xml文件也是非常的简单了

 代码如下 复制代码

header("Content-type:text/html; Charset=utf-8");

$url = "createXML.php";

$reader = new XMLReader(); //实例化XMLReader

$reader->open($url); //获取xml

$i=1;

while ($reader->read()) {

if ($reader->nodeType == XMLReader::TEXT) { //判断node类型

$m = $i%3;

if($m==1)

$name = $reader->value; //读取node值

if($m==2)

$sex = $reader->value;

if($m==0){

$age = $reader->value;

$arr[] = array(

'name' => $name,

'sex' => $sex,

'age' => $age

);

}

$i++;

}

}

//print_r($arr);

本文章简单介绍关于php中DOMElement操作xml文档程序有需要的朋友可参考。

例1

 代码如下 复制代码

<?php

//Store your html into $html variable.

$html="<html>
<head>
<title>Rakesh Verma</title>
</head>

<body>
    <a href='http://example.com'>Example</a>
    <a href='http://google.com'>Google</a>
    <a href='http://www.yahoo.com'>Yahoo</a>
</body>

</html>";

$dom = new DOMDocument();
$dom->loadHTML($html);

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        //remove and set target attribute       
        $href->removeAttribute('target');
        $href->setAttribute("target", "_blank");

        $newURL=$url.".au";

        //remove and set href attribute       
        $href->removeAttribute('href');
        $href->setAttribute("href", $newURL);
}

// save html
$html=$dom->saveHTML();

echo $html;

?>

例2

 代码如下 复制代码

/*<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- css的样式定义,不加点。如:name{color:red;} -->
<?xml-stylesheet type="text/css" href="css.css"?>
<!-- 引入dtd文档定义文件 (根元素:班级)<!DOCTYPE 班级 SYSTEM "class.dtd" /> -->
<!-- <!DOCTYPE 班级[
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
] /> -->
<班级>
<学生 number="101">
<名字>孙悟空</名字>
<名字>孙行者</名字>
<年龄>123</年龄>
<介绍><![CDATA[&*$%特殊字串^&#$&]]></介绍>
</学生>

<学生 number="10&quot;2">
<名字>白骨精</名字>
<年龄>140</年龄>
<介绍>介绍内容</介绍>
</学生>
</班级>
*/
$xmldoc = new DOMDocument('1.0', 'UTF-8');
$xmldoc->load('datas.xml');

$itemsNodeList = $xmldoc->getElementsbyTagName('学生');
$itemElement = $itemsNodeList->item(0);//得到第一个完整的学生信息节点
$itemChildsNodeList = $itemElement->getElementsbyTagName('名字');//得到子节点“名字”,也许有多个名字
$itemChildNode = $itemChildsNodeList->item(0);//得到第一个名字节点
echo $itemChildNode->nodeValue;//输出节点值

//封装成函数
$nodeArr = array('名字', '年龄', '介绍');
function getNodeVal($xmldoc, $itemsName, $nodeArr){
    $items = $xmldoc->getElementsByTagName($itemsName);
     for($i=0; $i < $items->length; $i++){
        $item = $items->item($i);
        foreach($nodeArr as $node){
            $data[$i][] = $item->getElementsByTagName($node)->item(0)->nodeValue;
        }
    }
    return $data;
}

$data = getNodeVal($xmldoc, '学生', $nodeArr);
print_r($data);

PHP 提供了 simplexml_load_string 方法用来解析 XML 格式的字符串,并返回 SimpleXMLElement 对象。不过一般数组是更为适用的,所以也会有转换为普通数组的需求,这个方法测试完全奏效,支持 SimpleXMLElement 对象多层嵌套的情况。

提供两个参数,第一个参数为 SimpleXMLElement 对象,第二个参数为布尔值,控制最终返回值是否包含根节点。

 代码如下 复制代码

function xmlToArr ($xml, $root = true) {

  if (!$xml->children()) {
   return (string) $xml;
  }
  $array = array();
  foreach ($xml->children() as $element => $node) {
   $totalElement = count($xml->{$element});
   if (!isset($array[$element])) {
    $array[$element] = "";
   }
   // Has attributes
   if ($attributes = $node->attributes()) {
    $data = array(
     'attributes' => array(),
     'value' => (count($node) > 0) ? $this->__xmlToArr($node, false)

: (string) $node
    );
    foreach ($attributes as $attr => $value) {
     $data['attributes'][$attr] = (string) $value;
    }
    if ($totalElement > 1) {
     $array[$element][] = $data;
    } else {
     $array[$element] = $data;
    }
   // Just a value
   } else {
    if ($totalElement > 1) {
     $array[$element][] = $this->__xmlToArr($node, false);
    } else {
     $array[$element] = $this->__xmlToArr($node, false);
    }
   }
  }
  if ($root) {
   return array($xml->getName() => $array);
  } else {
   return $array;
  }

 }

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25