XML 解析和转换

 

ArrayToXml(数组转XML字符串)

 

use zxf\Xml\Array2XML;

$xml = Array2XML::createXML($array,?'root_node_name', ?$attr, ?$docType);
echo $xml->saveXML();

1、普通数组转XML => createXML 方法

$array = [
    'Good_guy' => [
        'name' => 'Luke Skywalker',
        'weapon' => 'Lightsaber'
    ],
    'Bad_guy' => [
        'name' => 'Sauron',
        'weapon' => 'Evil Eye'
    ]
];

$xml = Array2XML::createXML($array,'root',[
    'version' => '1.0',
    'encoding' => 'UTF-8',
    'standalone' => true,
    'formatOutput' => true
]);
echo $xml->saveXML();

2、转微信文档中示例的 XML 数据 => createWechatXML 方法

// 输入数组数据
$data = [
    'ToUserName' => 'toUser',
    'FromUserName' => 'fromUser',
    'CreateTime' => 12345678, // int 类型的数据 转换后不会携带CDATA
    'MsgType' => 'text',
    'Content' => 'Hello World'
];
$xml = Array2XML::createWechatXML($data);

echo $xml; 

得到

<?xml version="1.0" encoding="UTF-8"?>
<xml>
	<ToUserName><![CDATA[toUser]]></ToUserName>
	<FromUserName><![CDATA[fromUser]]></FromUserName>
	<CreateTime>12345678</CreateTime>
	<MsgType><![CDATA[text]]></MsgType>
	<Content><![CDATA[Hello World]]></Content>
</xml>

XmlToArray(XML 转数组)

use zxf\Xml\XML2Array;

/**
 * XML解析器
 *
 * 主要特性:
 * 1. 可控的外层节点保留/移除
 * 2. 增强的流式处理能力
 * 3. 智能内存管理
 * 4. 多层级错误处理
 * 5. 支持XML注释处理
 */

/**
 * @example
 *      1、支持解析微信官方文档中示例的 XML 数据
 *      <xml>
 *          <ToUserName><![CDATA[toUser]]></ToUserName>
 *          <FromUserName><![CDATA[fromUser]]></FromUserName>
 *          <CreateTime>12345678</CreateTime>
 *          <MsgType><![CDATA[text]]></MsgType>
 *          <Content><![CDATA[Hello World]]></Content>
 *      </xml>
 *
 *      2、支持解析普通的xml 字符串
 *      <catalog>
 *          <book>
 *              <title>PHP 手册</title>
 *              <author>张三</author>
 *          </book>
 *          <book>
 *              <title>Laravel 高级开发</title>
 *              <author>李四</author>
 *          </book>
 *      </catalog>
 *
 *     1、示例化后调用
 *          $parser = new XML2Array();
 *          // 或者定义配置
 *          // $parser = new XML2Array(['preserveRootNode' => false]);
 *          $result = $parser->parse('<root><item>value</item></root>'); // 解析XML字符串为数组
 *          // 获取统计信息
 *          $stats = $parser->getStats();
 *          print_r($stats);
 *     2、静态调用
 *         XML2Array::toArray('<root><item>value</item></root>');
 */

默认的配置参数

[
        'attributePrefix' => '@',          // 属性前缀
        'textNodeName' => '#text',      // 文本节点名称
        'commentNodeName' => '#comment',   // 注释节点名称
        'autoArray' => false,         // 自动创建数组
        'namespaceHandling' => 'remove',     // 三种命名空间处理模式:none(忽略)、remove(移除前缀)、preserve(保留)
        'parseAttributes' => true,         // 解析属性
        'parseComments' => false,        // 是否解析注释
        'trimValues' => true,         // 修剪值
        'typeDetection' => true,         // 启用类型检测
        'encoding' => 'UTF-8',      // 默认编码
        'preserveRootNode' => false,         // 是否保留根节点
        'removeXmlDeclaration' => true,         // 是否移除XML声明
        'libxmlOptions' => LIBXML_NOCDATA | LIBXML_NOBLANKS | LIBXML_NONET | LIBXML_COMPACT | LIBXML_PARSEHUGE,
        'maxDepth' => 50,           // 最大递归深度
        'validateOnParse' => false,        // 启用XML验证
        'schemaValidation' => false,        // 使用XSD验证
        'schemaPath' => null,         // XSD文件路径
        'memoryLimit' => null,         // 内存限制(字节)
    ];