Cake\Utility\
Xml
¶Xml类充许将数组转换成 SimpleXMLElement
或者 DOMDocument
对象,并且可以转回数组。
Cake\Utility\Xml::
build
($input, array $options = [])¶你可使用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();
}
注解
DOMDocument 和 SimpleXML 实现了不同的API’s。你从XML请求的对象,一定要使用正确的方法。
toArray($obj);
用Xml类把Xml字符串转换成数组是非简单的。默认你将获得返回值是SimpleXml对象:
$xmlString = '<?xml version="1.0"?><root><child>value</child></root>';
$xmlArray = Xml::toArray(Xml::build($xmlString));
如果你的XML是无效的将会执行 Cake\Utility\Exception\XmlException
异常类。
$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);
小技巧
用SimpleXMLElement 或者 DomDocument处理Xml后, 可以使用Xml::toArray()。