说明

部分说明在示例代码的注释部分,递归处理多维数组转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(...);