<!--PHP编程实战-->
<!--XML -->
<!--14-7-->
<!--查找基于特定属性的值-->
<?php
error_reporting(E_ALL ^ E_NOTICE);
$xml = simplexml_load_file("template.xhtml");
findDivContentsByID($xml, "main_center");
function findDivContentsByID($xml, $id)
{ //类似于广度优先遍历,但这里不是递归,只有两层.
foreach ($xml->body->div as $divs) {
if (!empty($divs->div)) {
foreach ($divs->div as $inner_divs) {
if (isElementWithID($inner_divs, $id)) {
break 2;
}
}
} else {
//如果没有子div,就检查第一层divs
if (isElementWithID($divs, $id)) {
break;
}
}
}
}
function isElementWithID($element, $id)
{ //$element是SimpleXMLElement对象,需要转化成字符串输出.(String后直接变成了元素内容)
$actual_id = (String)$element->attributes()->id;
if ($actual_id == $id) {
$value = trim((String)$element);
print "value of #$id id: $value";
return true;
}
return false;
}
?>
template.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
<div id="header">
header would be here
</div>
<div id="menu">
menu would be here
</div>
<div id="main_content">
<div id="main_left">
left sidebar
</div>
<div id="main_center" class="foobar">
main story
</div>
<div id="main_right">
right sidebar
</div>
</div>
<div id="footer">
footer would be here
</div>
</body>
</html>
template.xhtml的前两行定义XML所用的版本和DOCTYPE,这两行不是树的一部分,这里树指的是SimpleXMLElement的树。树的跟元素是<html>元素。
php代码14-7采用了面向对象的SimpleXML方法,找出body元素的所有div,以及这些div元素的直接子div元素。然后,匹配每个div元素并将其id属性与要搜索的值“main_center"相比较。如果相同,打印出它们的值并中断循环。
重点
- 程序不够健壮,如果文档结构改变或深度超过两个层次,将无法找到ID.
- XHTML文档遵循HTML文档中的DOM.
- 在元素值中,空格被捕获,因此可能需要对字符串使用PHP的trim()函数.
网友评论