Xml
Xml类充许将数组转换成 SimpleXMLElement
或者 DOMDocument
对象,并且可以转回数组。
创建XML对象
你可使用Xml::build() 载入XML-ish数据。取决于你 $options
的参数,这个方法允许你返回一个 SimpleXMLElement (default) or DOMDocument
对象,在各种数据源中,你可使用 Xml::build()
去创建一个XML对象。例如,你可以通过下面的设置创建XML:
$text = '<?xml version="1.0" encoding="utf-8"?> <post> <id>1</id> <title>Best post</title> <body> ... </body> </post>'; $xml = Xml::build($text);
你也可以通过本地文件创建Xml对象:
//本地文件 $xml = Xml::build('/home/awesome/unicorns.xml');
你也可以通可一个数组创建Xml对象:
$data = [ 'post' => [ 'id' => 1, 'title' => 'Best post', 'body' => ' ... ' ] ]; $xml = Xml::build($data);
如果你的输入参数是无效的,Xml类会抛出一个异常:
$xmlString = 'What is XML?'; try { $xmlObject = Xml::build($xmlString); // 这儿会抛出一个异常 } catch (\Cake\Utility\Exception\XmlException $e) { throw new InternalErrorException(); }
Note
DOMDocument 和 SimpleXML 实现了不同的API’s。你从XML请求的对象,一定要使用正确的方法。
把Xml字符串转换成数组
用Xml类把Xml字符串转换成数组是非简单的。默认你将获得返回值是SimpleXml对象:
$xmlString = '<?xml version="1.0"?><root><child>value</child></root>'; $xmlArray = Xml::toArray(Xml::build($xmlString));
如果你的XML是无效的将会执行 Cake\Utility\Exception\XmlException
异常类。
把数组转换成Xml
$xmlArray = ['root' => ['child' => 'value']]; //你也可以使用 Xml::build(). $xmlObject = Xml::fromArray($xmlArray, ['format' => 'tags']); $xmlString = $xmlObject->asXML();
你数组最上级必须包含一个元素而且不能是数字,如果你的数据不是这种格式,Xml装会抛出一个异常,无效的数组示例:
// 最上层数组的键名是一个数字 [ ['key' => 'value'] ]; // 最上层数组有多个键值 [ 'key1' => 'first value', 'key2' => 'other value' ];
默认的数组值将作为一个xml标签输出,如果你想自定义一个属性或者文本值,你可以在属性加面加@。文本值用 @作为键名:
$xmlArray = [ 'project' => [ '@id' => 1, 'name' => 'Name of project, as tag', '@' => 'Value of project' ] ]; $xmlObject = Xml::fromArray($xmlArray); $xmlString = $xmlObject->asXML();
The content of $xmlString
will be:
<?xml version="1.0"?> <project id="1">Value of project<name>Name of project, as tag</name></project>
使用命名空间
使用XML命名空间,在数组中创键一个名字是xmlns的键名:在一个通用的命名空间或输入前缀的xmlns:自定义命名空间。 看下面的示例:
$xmlArray = [ 'root' => [ 'xmlns:' => 'https://cakephp.org', 'child' => 'value' ] ]; $xml1 = Xml::fromArray($xmlArray); $xmlArray( 'root' => [ 'tag' => [ 'xmlns:pref' => 'https://cakephp.org', 'pref:item' => [ 'item 1', 'item 2' ] ] ] ); $xml2 = Xml::fromArray($xmlArray);
$xml1 和 $xml2 的值分别是:
<?xml version="1.0"?> <root xmlns="https://cakephp.org"><child>value</child> <?xml version="1.0"?> <root><tag xmlns:pref="https://cakephp.org"><pref:item>item 1</pref:item><pref:item>item 2</pref:item></tag></root>
创建一个子节点
当你创建一个XML文档,你只需要对你的文档使用原生接口操作增加,移除或者操作子节点:
// 使用 SimpleXML $myXmlOriginal = '<?xml version="1.0"?><root><child>value</child></root>'; $xml = Xml::build($myXmlOriginal); $xml->root->addChild('young', 'new value'); // 使用 DOMDocument $myXmlOriginal = '<?xml version="1.0"?><root><child>value</child></root>'; $xml = Xml::build($myXmlOriginal, ['return' => 'domdocument']); $child = $xml->createElement('young', 'new value'); $xml->firstChild->appendChild($child);
Tip
用SimpleXMLElement 或者 DomDocument处理Xml后, 可以使用Xml::toArray()。