说明
部分说明在示例代码的注释部分,递归处理多维数组转XML在文章末尾
一、判断字符串是否是标准XML格式
xml_parse
定义和用法
xml_parse() 函数解析 XML 文档。
如果成功,则返回 true。否则,返回 false。
语法
xml_parse(parser,xml,end)
参数 | 描述 |
parser | 必需。规定要使用的 XML 解析器。 |
xml | 必需。规定要解析的 XML 数据。 |
end | 可选。如果该参数是 true,则 xml 参数中的数据为当前解析中最后一段数据。 |
示例
function parserXML(string $string)
{
// 创建一个 XML 解析器使用 xml_parser_create() 函数
$xml_parser = xml_parser_create();
if (!xml_parse($xml_parser, $string, true)) {
// xml_parser_free() 函数释放 XML 解析器。
xml_parser_free($xml_parser);
return false;
}
return true;
}
二、XML转成数组或对象
simplexml_load_string
定义和用法
simplexml_load_string() 函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象。
返回值:如果成功则返回 SimpleXMLElement 对象,如果失败则返回 FALSE。
语法
simplexml_load_string(data,classname,options,ns,is_prefix);
参数 | 描述 |
data | 必需。规定形式良好的 XML 字符串。 |
classname | 可选。规定新对象的 class。 |
options | 可选。规定附加的 Libxml 参数。通过指定选项为 1 或 0(TRUE 或 FALSE,例如 LIBXML_NOBLANKS(1))进行设置 可能的值: LIBXML_COMPACT - 激活节点的优化配置(可加速应用程序) LIBXML_DTDATTR - 设置默认的 DTD 属性 LIBXML_DTDLOAD - 装载额外的子集 LIBXML_DTDVALID - 验证 DTD 有效性 LIBXML_NOBLANKS - 删除空节点 LIBXML_NOCDATA - 将 CDATA 设置为文本节点 LIBXML_NOEMPTYTAG - 扩展空标签,仅在 DOMDocument->save() 和 DOMDocument->saveXML() 函数中有效 LIBXML_NOENT - 替代实体 LIBXML_NOERROR - 不显示错误报告 LIBXML_NONET - 装载文档时停止访问网络 LIBXML_NOWARNING - 不显示警告报告 LIBXML_NOXMLDECL - 当存储一个文档时放弃 XML 声明 LIBXML_NSCLEAN - 删除多余的名称空间声明 LIBXML_PARSEHUGE - 设置 XML_PARSE_HUGE 标志,用来放宽解析器的任何强制限制。这将影响诸如文档的最大深度和文本节点大小限制等。 LIBXML_XINCLUDE - 使用 XInclude 替代 LIBXML_ERR_ERROR - 获取可纠正的错误 LIBXML_ERR_FATAL - 获取致命错误 LIBXML_ERR_NONE - 不获取错误 LIBXML_ERR_WARNING - 获取简单警告 LIBXML_VERSION - 获取 libxml 版本(例如 20605 或 20617) LIBXML_DOTTED_VERSION - 获取带点的 libxml 版本(例如 2.6.5 或 2.6.17) |
ns | 可选。规定命名空间前缀或 URI。 |
is_prefix | 可选。规定一个布尔值。如果 ns 是前缀则为 TRUE,如果 ns 是 URI 则为 FALSE。默认是 FALSE。 |
示例
/**
* parserXMLToArray
* XML Conversion to Arrays
* @param string $resp
* @param bool $format 默认object返回对象,需要返回数组请传入array
* @return bool|mixed|\SimpleXMLElement
* @author liuml
* @DateTime 2018/12/19 9:58
*/
function parserXMLToArray(string $resp, $format = 'object')
{
/*if(!parserXML($resp)){
return false;
}*/
$disableLibxmlEntityLoader = libxml_disable_entity_loader(true);
// 如果希望使用多个libxml选项,可以使用管道将它们分开,如下所示
// 如果不加 LIBXML_NOERROR 选项的话传入错误的xml字符串会抛出错误,加上这个选项会返回 false。或者在函数前面加上 @ 操作符也会返回false
// 也可以直接调用上面判断是否是一个标准的xml格式
$respObject = simplexml_load_string($resp, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOERROR);
libxml_disable_entity_loader($disableLibxmlEntityLoader);
if (false === $respObject) {
return false;
}
if ($format === 'array') {
return json_decode(json_encode($respObject), true);
}
return $respObject;
}
三、数组转换成 XML
示例
第一种方法
/**
* parserArrayToXML
* 递归处理多维数组转XML
* @param $arr 可以是多维数组
* @return string
* @author liuml <liumenglei0211@163.com>
* @DateTime 2018/12/18 18:22
*/
function parserArrayToXML(\SimpleXMLElement $obj, array $array, $child = "items")
{
foreach ($array as $key => $value) {
if (is_numeric($key)){
$key = $child . $key;
}
if (is_array($value)) {
$node = $obj->addChild($key);
parserArrayToXML($node, $value);
} else {
$obj->addChild($key, htmlspecialchars($value));
}
}
}
// 数组参数解析成xml
$string = '<?xml version="1.0" encoding="utf-8"?><document/>';
$xml = new \SimpleXMLElement($string);
parserArrayToXML($xml, $array);
echo $xml->asXML(); // 输出 XML 字符串
第二种方法
/**
* array_to_xml
* @param $array
* @return string
* @author liuml <liumenglei0211@163.com>
* @DateTime 2018/12/25 10:37
*/
function array_to_xml($array)
{
if (is_object($array)) {
$array = get_object_vars($array);
}
$xml = '';
foreach ($array as $key => $value) {
$_tag = $key;
$_id = NULL;
if (is_numeric($key)) {
$_tag = 'item';
$_id = 'id="' . $key . '"';
}
$xml .= "<{$_tag}{$_id}>";
$xml .= (is_array($value) || is_object($value)) ? array_to_xml($value) : htmlentities($value);
$xml .= "</{$_tag}>";
}
return $xml;
}
/**
* xml_encode
* @param $data
* @param string $charset
* @param string $root
* @return string
* @author liuml <liumenglei0211@163.com>
* @DateTime 2018/12/25 10:41
*/
function arrayToXml($data, $charset = 'utf-8', $root = 'document')
{
$xml = '<?xml version="1.0" encoding="' . $charset . '"?>';
$xml .= "<{$root}>";
$xml .= array_to_xml($data);
$xml .= "</{$root}>";
return $xml;
}
arrayToXml(...);