本文章来给大家介绍一个PHP 操作xml编程之xml的crud操作,有需要了解的同学可参考。
html代码页面
代码如下 |
复制代码 |
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
</head>
<body>
<form action="wordProcess.php" method="post">
<input type="text" name="enword">
<input type="hidden" name="type" value="query">
<input type="submit" value="查询">
</form>
<span>添加单词</span>
<form action="wordProcess.php" method="post">
英文:<input type="text" name="enword"><br>
中文:<input type="text" name="zhword"><br>
<!--<input type="hidden" name="type" value="insert">
<input type="hidden" name="type" value="update"> -->
<input type="submit" name="type" value="添加">
<input type="submit" name="type" value="修改">
</form>
<form action="wordProcess.php" method="post">
<input type="text" name="word">
<input type="hidden" name="type" value="delete">
<input type="submit" value="删除">
</form>
</body>
</html>
|
wordpress.php文件
代码如下 |
复制代码 |
<?php
//接收类型 看看用户做什么(查询、添加....)
$type=$_REQUEST['type'];
//echo $type;
//exit();
//创建xml文档对象
$doc=new DOMDocument();
$doc->load("words.xml");
//进行判断
if($type=="query"){
//获取用户输入的值
$enword=$_REQUEST['enword'];
//判断是否进入查询
$isEnter=false;
//获取所有单词节点
$words=$doc->getElementsByTagName("word");
//遍历单词节点
for($i=0;$i<$words->length;$i++){
$word_node=$words->item($i);
//获取不同的语种
$en_word=getNodeVal($word_node,"en");
$zh_word=getNodeVal($word_node,"zh");
//查询
if($enword==$en_word){
$isEnter=true;
echo $enword."的中文意思是:".getNodeVal($word_node,"zh");
echo "<br/><a href='wordView.php'>返回继续查询</a>";
}else if($enword==$zh_word){
$isEnter=true;
echo $enword."的英文意思是:".getNodeVal($word_node,"en");
echo "<br/><a href='wordView.php'>返回继续查询</a>";
}
}
if(!$isEnter){
echo "无法查询";
echo "<br/><a href='wordView.php'>返回继续查询</a>";
}
}else if($type=="添加"){
//接收
$enword=$_REQUEST['enword'];
$zhword=$_REQUEST['zhword'];
if(!empty($enword)&&!empty($zhword)){
//获取根节点
$root=$doc->getElementsByTagName("words")->item(0);
$word=$doc->createElement("word");
$en=$doc->createElement("en",$enword);
$zh=$doc->createElement("zh",$zhword);
//进行挂载
$root->appendChild($word);
$word->appendChild($en);
$word->appendChild($zh);
//保存xml文件
$doc->save("words.xml");
echo "添加成功<br/><a href='wordView.php'>返回继续操作</a>";
}else{
echo "请输入单词";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
exit();
}
}else if($type=="delete"){
$word=$_REQUEST['word'];
//获取所有单词节点
$words=$doc->getElementsByTagName("word");
$isEnter=false;
//遍历单词节点
for($i=0;$i<$words->length;$i++){
$word_node=$words->item($i);
//获取不同的语种
$en_word=getNodeVal($word_node,"en");
$zh_word=getNodeVal($word_node,"zh");
//查询
if($word==$en_word || $word==$zh_word){
$isEnter=true;
//找到父节点
$word_node->parentNode->removeChild($word_node);
$doc->save("words.xml");
echo "删除成功<br/><a href='wordView.php'>返回继续操作</a>";
}
}
if(!$isEnter){
echo "操作失败";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
}
}else if($type="修改"){
//接收
$enword=$_REQUEST['enword'];
$zhword=$_REQUEST['zhword'];
if(!empty($enword)&&!empty($zhword)){
//获取所有单词节点
$words=$doc->getElementsByTagName("word");
//遍历单词节点
$isEnter=false;
for($i=0;$i<$words->length;$i++){
$word_node=$words->item($i);
//获取不同的语种
$en_word=getNodeVal($word_node,"en");
$zh_word=getNodeVal($word_node,"zh");
//查询
if($enword==$en_word && $zhword!=$zh_word){
//修改中文
$isEnter=true;
//获取zh节点
$zh=$word_node->getElementsByTagName("zh")->item(0);
$zh->nodeValue=$zhword;
$doc->save("words.xml");
echo "修改成功";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
}else if($enword!=$en_word && $zhword==$zh_word){
//修改因为
$isEnter=true;
$en=$word_node->getElementsByTagName("en")->item(0);
$en->nodeValue=$enword;
$doc->save("words.xml");
echo "修改成功";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
}
}
if(!$isEnter){
echo "没有做任何修改";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
}
}else{
echo "请输入需要修改的单词";
echo "<br/><a href='wordView.php'>返回继续操作</a>";
exit();
}
}
//获取节点的文本值
function getNodeVal(&$MyNode,$tagName){
return $MyNode->getElementsByTagName($tagName)->item(0)->nodeValue;
}
?>
|
words.xml
代码如下 |
复制代码 |
<?xml version="1.0" encoding="utf-8"?>
<words><word><en>boy</en><zh>男孩</zh></word><word><en>girl</en><zh>女孩</zh></word><word><en>fire</en><zh>火</zh></word><word><en>word</en><zh>词库</zh></word></words>
|
在php中操作xml文档我们可以直接调用DOMDocument类或使用simplexml_load_string类来操作,这些都不需要加载算是内置函数了,我们直接使用。
是PHP脚本读取XML最原始,最笨的方法。
代码如下 |
复制代码 |
$doc = new DOMDocument();
$doc->load('test.xml');
$rows = $doc->getElementsByTagName("ds");
$d = array();
$i = 0;
foreach($rows as $row)
{
$web = $row->getElementsByTagName('web');
$webUrl = $row->getElementsByTagName('webUrl');
$d[$i]['web'] = $web->item(0)->nodeValue;
$d[$i]['webUrl'] = $webUrl->item(0)->nodeValue;
$i++;
}
print_R($d);
|
简单,容易,速度快
代码如下 |
复制代码 |
$xmlData = file_get_contents('test.xml');
$xml = simplexml_load_string($xmlData);
$xmlArr = objectToArray($xml);
objectToArray函数代码如下
function objectToArray($object)
{
if(!$object) return '';
$result = array();
$object = is_object($object) ? get_object_vars($object) : $object;
foreach ($object as $key => $val) {
$val = (is_object($val) || is_array($val)) ? objectToArray($val) : $val;
$result[$key] = $val;
}
return $result;
}
|
上面讲到了读取xml,下面再介绍写xml实例
代码如下 |
复制代码 |
$arr = array(
array('id'=>1,'web'=>'好脚本','webUrl'=>'http://www.111cn.net'),
array('id'=>2,'web'=>'PHP脚本','webUrl'=>'http://www.111cn.net/'),
array('id'=>3,'web'=>'JavaScript脚本','webUrl'=>'http://www.111cn.net/'),
array('id'=>4,'web'=>'js脚本','webUrl'=>'http://www.111cn.net/'),
array('id'=>5,'web'=>'PHP脚本示例','webUrl'=>'http://www.111cn.net/'),
array('id'=>5,'web'=>'JavaScript脚本示例','webUrl'=>'http://www.111cn.net/')
);
/*使用dom生成xml,注意生成的xml中会没有空格。*/
$dom=new DOMDocument('1.0','utf-8');
$path= "logs/test.xml";
$data=$dom->createElement('data');
$dom->appendChild($data);
foreach($arr as $v)
{
$ds = $dom->createElement('ds');
$id = $dom->createAttribute('id');
$id->nodeValue = $v['id'];
$ds->setAttributeNode($id);
$data->appendChild($ds);
foreach($v as $kk=>$vv)
{
${$kk} = $dom->createElement($kk);
$value= $dom->createTextNode($vv);
${$kk}->appendChild($value);
$ds->appendChild(${$kk});
}
}
$dom->saveXML();
$dom->save($path);
|
xml文件是一种数据存储格式,下面小编给大家介绍php解析xml格式文件的多种方法总结介绍,DOMDocument是我们常用的解析xml一个不错的方法,下面我来给大家总结总结。
DOMElement
DOMElement DOMDocument::createElement ( string $name [, string $value ] )
创建节点元素
String $name:节点名
String $value:节点的值
8、 添加节点
•DOMNode DOMNode::appendChild ( DOMNode $newnode )
添加子节点
DOMNode $newnode:新节点
在dom操作中,增删改操作必须依赖于父节点
9、 保存
•string DOMDocument::saveXML
保存至某个字符串中
•int DOMDocument::save ( string $filename )
保存至某个文件中
String $filename:文件名
10、 删除节点
•DOMNode DOMNode::removeChild ( DOMNode $oldnode )
删除节点
DOMNode $oldnode:要删除的节点
11、 更新节点
•DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )
DOMNode $newnode:新节点
DOMNode $oldnode:原节点
12、 添加属性
•DOMAttr DOMElement::setAttribute( string $name , string $value )
string $name :属性名
string $value :属性值
13、 修改属性
DOMAttr DOMElement::setAttribute( string $name , string $value )
string $name :属性名
string $value :属性值
14、 删除属性
•bool DOMElement::removeAttribute ( string $name )
string $name:要删除的属性名称
15、 获取属性
•string DOMElement::getAttribute ( string $name )
string $name:要获取的属性值的属性名
DOMDocument还是PHP5后推出的DOM扩展的一部分,可用来建立或解析html/xml,目前只支持utf-8编码。
代码如下 |
复制代码 |
$xmlstring = <<<XML
<?xml version='1.0'?>
<document>
<cmd attr='default'>login</cmd>
<login>imdonkey</login>
</document>
XML;
$dom = new DOMDocument();
$dom->loadXML($xmlstring);
print_r(getArray($dom->documentElement));
function getArray($node) {
$array = false;
if ($node->hasAttributes()) {
foreach ($node->attributes as $attr) {
$array[$attr->nodeName] = $attr->nodeValue;
}
}
if ($node->hasChildNodes()) {
if ($node->childNodes->length == 1) {
$array[$node->firstChild->nodeName] = getArray($node->firstChild);
} else {
foreach ($node->childNodes as $childNode) {
if ($childNode->nodeType != XML_TEXT_NODE) {
$array[$childNode->nodeName][] = getArray($childNode);
}
}
}
} else {
return $node->nodeValue;
}
return $array;
}
|
SimpleXML
SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed)。它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地说明了函数的作用。三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作
代码如下 |
复制代码 |
$string = <<<XML
<?xml version='1.0'?>
<document>
<cmd>login</cmd>
<login>imdonkey</login>
</document>
XML;
$xml = simplexml_load_string($string);
print_r($xml);
$login = $xml->login;//这里返回的依然是个SimpleXMLElement对象
print_r($login);
$login = (string) $xml->login;//在做数据比较时,注意要先强制转换
print_r($login);
|
SimpleXML的优点是开发简单,缺点是它会将整个xml载入内存后再进行处理,所以在解析超多内容的xml文档时可能会力不从心。如果是读取小文件,而且xml中也不包含namespace,那SimpleXML是很好的选择。
XMLReader
XMLReader也是PHP5之后的扩展(5.1后默认安装),它就像游标一样在文档流中移动,并在每个节点处停下来,操作起来很灵活。它提供了对输入的快速和非缓存的流式访问,可以读取流或文档,使用户从中提取数据,并跳过对应用程序没有意义的记录。
以一个利用google天气api获取信息的例子展示下XMLReader的使用,这里也只涉及到一小部分函数,更多还请参考官方文档。
代码如下 |
复制代码 |
$xml_uri = 'http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';
$current = array();
$forecast = array();
$reader = new XMLReader();
$reader->open($xml_uri, 'gbk');
while ($reader->read()) {
//get current data
if ($reader->name == "current_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
while($reader->read() && $reader->name != "current_conditions") {
$name = $reader->name;
$value = $reader->getAttribute('data');
$current[$name] = $value;
}
}
//get forecast data
if ($reader->name == "forecast_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
$sub_forecast = array();
while($reader->read() && $reader->name != "forecast_conditions") {
$name = $reader->name;
$value = $reader->getAttribute('data');
$sub_forecast[$name] = $value;
}
$forecast[] = $sub_forecast;
}
}
$reader->close();
|
XMLReader和XML Parser类似,都是边读边操作,较大的差异在于SAX模型是一个“推送”模型,其中分析器将事件推到应用程序,在每次读取新节点时通知应用程序,而使用XmlReader的应用程序可以随意从读取器提取节点,可控性更好。
由于XMLReader基于libxml,所以有些函数要参考文档看看是否适用于你的libxml版本。
本文章来给大家介绍在php中生成和获取XML格式数据代码,生成xml我们使用DOMDocument,读取xml我们使用XMLReader即可,下面我分别给大家介绍。
生成XML格式数据
我们假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名、性别、年龄等信息。
代码如下 |
复制代码 |
CREATE TABLE `student` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`sex` varchar(10) NOT NULL,
`age` smallint(3) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
首先,建立createXML.php文件,先连接数据库,获取数据。
代码如下 |
复制代码 |
include_once ("connect.php"); //连接数据库
$sql = "select * from student";
$result = mysql_query($sql) or die("Invalid query: " . mysql_error());
while ($row = mysql_fetch_array($result)) {
$arr[] = array(
'name' => $row['name'],
'sex' => $row['sex'],
'age' => $row['age']
);
}
|
这个时候,数据就保存在$arr中,你可以使用print_r打印下数据测试。
接着,建立xml,循环数组,将数据写入到xml对应的节点中。
代码如下 |
复制代码 |
$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();
|
我们调用了PHP内置的类DOMDocument来处理与生成xml。最终生成的xml格式请点击这里看效果
代码如下 |
复制代码 |
<?xml version="1.0" encoding="utf-8"?>
<root>
<data>
<name>李王皓</name>
<sex>男</sex>
<age>21</age>
</data>
...
</root>
|
获取XML格式数据
现在我们假设要从第三方获取学生信息,数据格式是XML,我们需要使用PHP解析XML,然后将解析后的数据显示或者写入本地数据库。而这里关键的一步是解析XML。
PHP有很多中方法可以解析XML,其中PHP提供了内置的XMLReader类可以循序地浏览过xml档案的节点,你可以想像成游标走过整份文件的节点,并抓取需要的内容。使用XMLReader是高效的,尤其是读取非常大的xml数据,相对其他方法,使用XMLReader消耗内存非常少。
代码如下 |
复制代码 |
header("Content-type:text/html; Charset=utf-8");
$url = "importXML/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);
|
为了将数据name,sex和age分开,我们使用$i%3来判断取模,因为在获取的xml中,节点data下的信息是以3个子节点存在的。
本文章给来大家讲一下关于PHP 下simplexml使用方法,希望通过此文章能提升大家对simplexml操作xml文档的理解,有需要了解的朋友可参考。
PHP XML处理XML代码如下
代码如下 |
复制代码 |
<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<breakfast_menu>
<food id="1">
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
<calories>650</calories>
</food>
<food id="2">
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>light Belgian waffles covered with strawberries and whipped cream</description>
<calories>900</calories>
</food>
<food id="3">
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
<calories>900</calories>
</food>
</breakfast_menu> |
php解决xml代码
代码如下 |
复制代码 |
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>使用simpleXML处理XML</title>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0" width="700">
</tbody>
<tr bgcolor="green">
<th width="5%"> </th>
<th width="20%">name</th>
<th width="10%">price</th>
<th width="55%">description</th>
<th width="10%">calories</th>
</tr>
<?php
// 使用simpleXML处理XML
$xml = simplexml_load_file('./simple.xml');
//var_dump($xml);
//echo $xml->getName();
//var_dump($xml->children());
$record = '';
foreach ($xml->children() as $child)
{
$record .= '<tr><td>'. $child->attributes(). '</td>';
foreach ($child->children() as $item)
{
//var_dump($child);
$record .= '<td>'. $item .'</td>';
}
$record .= '</tr>';
}
echo $record;
?>
</tbody>
</table>
</body>
</html>
|
将XML转换为数组结构
代码如下 |
复制代码 |
private function change_simple_xml_to_array($obj){
$i = 0;
//从根节点下的二层子节点开始遍历
foreach($obj->children() as $value){
//如果发生同级、同标签名的情况,则加一维数组;
if(isset($last_name) && $value->getName()==$last_name){
//出现同名发现第二个,则推入第二维数组;
if($i==1) $arr[$last_name]=array($arr[$last_name]);
//遍历子节点;
array_push($arr[$last_name],$this->change_simple_xml_to_array($value));
}else{
$last_name = $value->getName();
if(count($value->children())==0) $arr[$last_name] = $value."";
else $arr[$last_name] = $this->change_simple_xml_to_array($value);
}
$i++;
}
return $arr;
}
——————XML文档——————
<?xml version="1.0" encoding="utf-8"?>
<use>
<login id="1">
<user>bddg</user>
<pas>abcdefg</pas>
<permission><fdsa>5</fdsa></permission>
<online_time>2</online_time>
</login>
<login id="2">
<user>baidongdaogu</user>
<pas>aaa</pas>
<permission>1</permission>
<online_time>2</online_time>
</login>
<login id="3">
<user>baidongdaogu</user>
<pas>aaa</pas>
<permission>1</permission>
<online_time>2</online_time>
</login>
</use>
————转换后的数组————
Array
(
[login] => Array
(
[0] => Array
(
[user] => bddg
[pas] => abcdefg
[permission] => Array
(
[fdsa] => 5
)
[online_time] => 2
)
[1] => Array
(
[user] => baidongdaogu
[pas] => aaa
[permission] => 1
[online_time] => 2
)
[2] => Array
(
[user] => baidongdaogu
[pas] => aaa
[permission] => 1
[online_time] => 2
)
)
)
|