什么是 PHP SimpleXML?
SimpleXML 是 PHP 5 中的新特性。
PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理。
SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。
与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。
SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如:
- 元素被转换为 SimpleXMLElement 对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中。
- 属性通过使用关联数组进行访问,其中的索引对应属性名称。
- 元素内部的文本被转换为字符串。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。
当执行类似下列的基础任务时,SimpleXML 使用起来非常快捷:
- 读取/提取 XML 文件/字符串的数据
- 编辑文本节点或属性
然而,在处理高级 XML 时,比如命名空间,最好使用 Expat 解析器或 XML DOM。
安装
从 PHP 5 开始,SimpleXML 函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。
PHP SimpleXML 实例
假设我们有如下的 XML 文件,"note.xml":
<?
xml
version
=
"
1.0
"
encoding
=
"
ISO-8859-1
"
?>
<
note
>
<
to
>
Tove
</
to
>
<
from
>
Jani
</
from
>
<
heading
>
Reminder
</
heading
>
<
body
>
Don't forget me this weekend!
</
body
>
</
note
>
现在我们想要输出上面的 XML 文件的不同信息:
实例 1
输出 $xml 变量(是 SimpleXMLElement 对象)的键和元素:
$xml
=
simplexml_load_file
(
"
note.xml
"
)
;
print_r
(
$xml
)
;
以上代码将输出:
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget me this weekend! )
实例 2
输出 XML 文件中每个元素的数据:
$xml
=
simplexml_load_file
(
"
note.xml
"
)
;
echo
$xml
->
to
.
"
<br>
"
;
echo
$xml
->
from
.
"
<br>
"
;
echo
$xml
->
heading
.
"
<br>
"
;
echo
$xml
->
body
;
以上代码将输出:
Tove Jani Reminder Don't forget me this weekend!
实例 3
输出每个子节点的元素名称和数据:
$xml
=
simplexml_load_file
(
"
note.xml
"
)
;
echo
$xml
->
getName
(
)
.
"
<br>
"
;
foreach
(
$xml
->
children
(
)
as
$child
)
{
echo
$child
->
getName
(
)
.
"
:
"
.
$child
.
"
<br>
"
;
}
以上代码将输出:
note to: Tove from: Jani heading: Reminder body: Don't forget me this weekend!
PHP 5 SimpleXML 函数
函数 | 描述 |
---|---|
__construct() | 创建一个新的 SimpleXMLElement 对象。 |
addAttribute() | 给 SimpleXML 元素添加一个属性。 |
addChild() | 给 SimpleXML 元素添加一个子元素。 |
asXML() | 格式化 XML(版本 1.0)中的 SimpleXML 对象的数据。 |
attributes() | 返回 XML 标签的属性和值。 |
children() | 查找指定节点的子节点。 |
count() | 计算指定节点的子节点个数。 |
getDocNamespaces() | 返回文档中的声明的命名空间。 |
getName() | 返回 SimpleXML 元素引用的 XML 标签的名称。 |
getNamespaces() | 返回文档中使用的命名空间。 |
registerXPathNamespace() | 为下一个 XPath 查询创建命名空间上下文。 |
saveXML() | asXML() 的别名。 |
simplexml_import_dom() | 从 DOM 节点返回 SimpleXMLElement 对象。 |
simplexml_load_file() | 转换 XML 文件为 SimpleXMLElement 对象。 |
simplexml_load_string() | 转换 XML 字符串为 SimpleXMLElement 对象。 |
xpath() | 运行对 XML 数据的 XPath 查询。 |
PHP 5 SimpleXML 迭代函数
函数 | 描述 |
---|---|
current() | 返回当前元素。 |
getChildren() | 返回当前元素的子元素。 |
hasChildren() | 检查当前元素是否有子元素。 |
key() | 返回当前键。 |
next() | 移动到下一个元素。 |
rewind() | 倒回到第一个元素。 |
valid() | 检查当前元素是否有效。 |
XML和数组互相转换的方法
//数组转XML
function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; } //将XML转为array function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
Array转XML
$money = 101; $sender = "xxxxx"; $obj2 = array(); $obj2['wxappid'] = APPID; $obj2['mch_id'] = MCHID; $obj2['mch_billno'] = MCHID.date('YmdHis').rand(1000, 9999); $obj2['client_ip'] = $_SERVER['REMOTE_ADDR']; $obj2['re_openid'] = $openid; $obj2['total_amount'] = $money; $obj2['min_value'] = $money; $obj2['max_value'] = $money; $obj2['total_num'] = 1; $obj2['nick_name'] = $sender; $obj2['send_name'] = $sender; $obj2['wishing'] = "你好世界"; $obj2['act_name'] = "你好"; $obj2['remark'] = "大家好";
转换后
<xml> <wxappid><![CDATA[wx1b7559b818e3c123]]></wxappid> <mch_id>1235571234</mch_id> <mch_billno>1235571234201605241726128109</mch_billno> <client_ip><![CDATA[127.0.0.1]]></client_ip> <re_openid><![CDATA[oiPuduGV7gJ_MOSfAWpVmhhgXh-U]]></re_openid> <total_amount>101</total_amount> <min_value>101</min_value> <max_value>101</max_value> <total_num>1</total_num> <nick_name><![CDATA[方倍工作室]]></nick_name> <send_name><![CDATA[方倍工作室]]></send_name> <wishing><![CDATA[恭喜发财]]></wishing> <act_name><![CDATA[方倍工作室送红包]]></act_name> <remark><![CDATA[关注公众账号]]></remark> </xml>
XML转为Array
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[发表成功]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code> <err_code><![CDATA[MONEY_LIMIT]]></err_code> <err_code_des><![CDATA[发表成功]></err_code_des> <mch_billno><![CDATA[1235571234201605241651123985]]></mch_billno> <mch_id>1235571234</mch_id> <wxappid><![CDATA[wx1b7559b818e3c123]]></wxappid> <re_openid><![CDATA[oiPuduGV7gJ_MOSfAWpVmhhgXh-U]]></re_openid> <total_amount>1</total_amount> </xml>
转换后
array(10) { ["return_code"]=> string(7) "SUCCESS" ["return_msg"]=> string(12) "发表成功" ["result_code"]=> string(7) "SUCCESS" ["err_code"]=> string(11) "MONEY_LIMIT" ["err_code_des"]=> string(12) "发表成功" ["mch_billno"]=> string(28) "1235571234201605241651123985" ["mch_id"]=> string(10) "1235571234" ["wxappid"]=> string(18) "wx1b7559b818e3c123" ["re_openid"]=> string(28) "oiPuduGV7gJ_MOSfAWpVmhhgXh-U" ["total_amount"]=> string(1) "1" }