PHP XML示例
SimpleXML解析器
SimpleXML解析器用于解析名称,属性和文本内容。
SimpleXML函数如下所示:
使用simplexml_load_file()
,此函数接受文件路径作为第一个参数,它是必需的。
simplexml_load_file($fileName,$class,$options,$ns,$is_prefix)
simplexml_load_string()
,此函数接受字符串而不是文件引用。
simplexml_load_string($XMLData,$class,$options,$ns,$is_prefix)
simplexml_import_dom()
,此函数接受DOM格式的XML内容,并将其转换为SimpleXML。
simplexml_load_string($DOMNode,$class)
以下示例显示了如何解析xml数据文件。
<?php
$data = "<?xml version = '1.0' encoding = 'UTF-8'?>
<note>
<Course>Android</Course>
<Subject>Android</Subject>
<Company>Jc2182</Company>
<Price>¥10</Price>
</note>";
$xml = simplexml_load_string($data) or die("错误: 不能建立对象");
?>
<html>
<head>
<body>
<?php
print_r($xml);
?>
</body>
</head>
</html>
尝试一下
获取节点值
以下代码提供了有关如何从xml文件获取节点值的信息,XML应如下所示
<?php
$xml = <<<XML
<?xml version = "1.0" encoding = "utf-8"?>
<jc>
<course category = "JAVA">
<title lang = "en">Java</title>
<tutor>Gopal</tutor>
<duration>9</duration>
<price>$30</price>
</course>
<course category = "HADOOP">
<title lang = "en">Hadoop</title>.
<tutor>Satish</tutor>
<duration>3</duration>
<price>$50</price>
</course>
<course category = "HTML">
<title lang = "en">html</title>
<tutor>raju</tutor>
<duration>5</duration>
<price>$50</price>
</course>
<course category = "WEB">
<title lang = "en">Web 技术</title>
<tutor>Javed</tutor>
<duration>10</duration>
<price>$60</price>
</course>
</jc>
XML;
?>
<html>
<body>
<?php
$xmlObj = simplexml_load_string($xml) or die("错误:不能建立对象。");
foreach($xmlObj->children() as $books) {
echo $books->title . "<br> ";
echo $books->tutor . "<br> ";
echo $books->duration . "<br> ";
echo $books->price . "<hr>";
}
?>
</body>
</html>
尝试一下
SAX解析器
SAX解析器用于解析xml文件,并且比样本xml解析器和DOM更适合内存管理。它不会将任何数据保存在内存中,因此可以用于非常大的文件。以下示例将说明如何使用SAX API从xml获取数据。
sax.xml文件内容如下:
<?xml version = "1.0" encoding = "utf-8"?>
<tutors>
<course>
<name>Android</name>
<country>China</country>
<email>[email protected]</email>
<phone>15912121212</phone>
</course>
<course>
<name>Java</name>
<country>China</country>
<email>[email protected]</email>
<phone>19912121212</phone>
</course>
<course>
<name>HTML</name>
<country>China</country>
<email>[email protected]</email>
<phone>18812121212</phone>
</course>
</tutors>
sax.php代码如下
<html>
<body>
<?php
//用SAX(Simple API for XML) 解析
$tutors = array();
$elements = null;
/**
* 标签开始时回调此函数
* @param $parser resource
* @param $name
* @param $attrs
*/
function startElements($parser, $name, $attrs) {
global $tutors, $elements;
if(!empty($name)) {
if ($name == 'COURSE') {
// 创建一个数组来存储信息
$tutors []= array();
}
$elements = $name;
}
}
/**
*
* 标签关闭时调用此函数
* @param $parser
* @param $name
*/
function endElements($parser, $name) {
global $elements;
if(!empty($name)) {
$elements = null;
}
}
/**
* 在标签的开头和结尾之间调用文本
* @param $parser
* @param $data
*/
function characterData($parser, $data) {
global $tutors, $elements;
if(!empty($data)) {
if ($elements == 'NAME' || $elements == 'COUNTRY' || $elements == 'EMAIL' || $elements == 'PHONE') {
$tutors[count($tutors)-1][$elements] = trim($data);
}
}
}
// 创建一个新的XML解析器并返回引用它的资源句柄以供其他XML函数使用。
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElements", "endElements");
xml_set_character_data_handler($parser, "characterData");
//打开xml文件
if (!($handle = fopen('sax.xml', "r"))) {
die("不能打开xml文件");
}
while($data = fread($handle, 4096)){ // 从打开文件句柄读
xml_parse($parser, $data); // 开始解析xml
}
xml_parser_free($parser); // 释放内存
$i = 1;
foreach($tutors as $course) {
echo "course No - ".$i.'<br/>';
echo "course Name - ".$course['NAME'].'<br/>';
echo "Country - ".$course['COUNTRY'].'<br/>';
echo "Email - ".$course['EMAIL'].'<br/>';
echo "Phone - ".$course['PHONE'].'<hr/>';
$i++;
}
?>
</body>
</html>
尝试一下
DOM解析器
用PHP5.X版本编写的HTML Dom解析器。Dom 解析器非常擅长处理XML和HTML。Dom解析器基于树进行传播,在访问数据之前,它会将数据加载到dom对象中,并将数据更新到Web浏览器。下面的示例显示了如何在Web浏览器中访问HTML数据。
<?php
$html = '
<head>
<title>JC2182</title>
</head>
<body>
<h2>课程详情</h2>
<table border = "0">
<tbody>
<tr>
<td>Android</td>
<td>Gopal</td>
<td>Sairam</td>
</tr>
<tr>
<td>Hadoop</td>
<td>Gopal</td>
<td>Satish</td>
</tr>
<tr>
<td>HTML</td>
<td>Gopal</td>
<td>Raju</td>
</tr>
<tr>
<td>Web 技术</td>
<td>Gopal</td>
<td>Javed</td>
</tr>
<tr>
<td>Graphic</td>
<td>Gopal</td>
<td>Satish</td>
</tr>
<tr>
<td>Writer</td>
<td>Kiran</td>
<td>Amith</td>
</tr>
<tr>
<td>Writer</td>
<td>Kiran</td>
<td>Vineeth</td>
</tr>
</tbody>
</table>
</body>
</html>
';
/*** 建立一个DOM对象 ***/
$dom = new domDocument;
/*** 把html字符串加载进来 前面拼接上HTML的声明和字符集***/
$dom->loadHTML('<!DOCTYPE html><head><meta charset="UTF-8"></head> ' .$html);
/*** 丢弃空白字符 ***/
$dom->preserveWhiteSpace = false;
/*** 获取表格标签 ***/
$tables = $dom->getElementsByTagName('table');
/*** 获取所有的表格行 ***/
$rows = $tables->item(0)->getElementsByTagName('tr');
/*** 循环表格的每一行 ***/
foreach ($rows as $row) {
/*** 获取每行的列标签 ***/
$cols = $row->getElementsByTagName('td');
/*** 输出每一列的值 ***/
echo 'Designation: '.$cols->item(0)->nodeValue.'<br />';
echo 'Manager: '.$cols->item(1)->nodeValue.'<br />';
echo 'Team: '.$cols->item(2)->nodeValue;
echo '<hr />';
}
?>
尝试一下