Xml 类允许您将数组转换为 SimpleXMLElement 或 DOMDocument 对象,反之亦然。
您可以使用 Xml::build()
加载类似 XML 的数据。根据您的 $options
参数,此方法将返回 SimpleXMLElement(默认)或 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 对象
// Local file
$xml = Xml::build('/home/awesome/unicorns.xml', ['readFile' => true]);
您还可以使用数组构建 Xml 对象
$data = [
'post' => [
'id' => 1,
'title' => 'Best post',
'body' => ' ... ',
]
];
$xml = Xml::build($data);
如果您的输入无效,Xml 类将抛出异常
$xmlString = 'What is XML?';
try {
$xmlObject = Xml::build($xmlString); // Here will throw an exception
} catch (\Cake\Utility\Exception\XmlException $e) {
throw new InternalErrorException();
}
注意
DOMDocument 和 SimpleXML 实现不同的 API。请确保在您从 Xml 请求的对象上使用正确的方法。
HTML 文档可以使用 loadHtml()
解析为 SimpleXmlElement
或 DOMDocument
对象
$html = Xml::loadHtml($htmlString, ['return' => 'domdocument']);
默认情况下,实体加载和大型文档解析被禁用。这些模式可以通过 loadEntities
和 parseHuge
选项分别启用。
使用 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']];
// You can use Xml::build() too.
$xmlObject = Xml::fromArray($xmlArray, ['format' => 'tags']);
$xmlString = $xmlObject->asXML();
您的数组在“顶层”只能有一个元素,并且不能是数字。如果数组不符合此格式,Xml 将抛出异常。无效数组的示例
// Top level with numeric key
[
['key' => 'value']
];
// Multiple keys in top level
[
'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();
$xmlString
的内容将是
<?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.com.cn',
'child' => 'value',
]
];
$xml1 = Xml::fromArray($xmlArray);
$xmlArray(
'root' => [
'tag' => [
'xmlns:pref' => 'https://cakephp.com.cn',
'pref:item' => [
'item 1',
'item 2'
]
]
]
);
$xml2 = Xml::fromArray($xmlArray);
$xml1
和 $xml2
的值将分别为
<?xml version="1.0"?>
<root xmlns="https://cakephp.com.cn"><child>value</child>
<?xml version="1.0"?>
<root><tag xmlns:pref="https://cakephp.com.cn"><pref:item>item 1</pref:item><pref:item>item 2</pref:item></tag></root>
创建 XML 文档后,只需使用您的文档类型原生的接口来添加、删除或操作子节点
// Using SimpleXML
$myXmlOriginal = '<?xml version="1.0"?><root><child>value</child></root>';
$xml = Xml::build($myXmlOriginal);
$xml->root->addChild('young', 'new value');
// Using 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()
。