Xml

class Cake\Utility\Xml

Xml 类允许您将数组转换为 SimpleXMLElement 或 DOMDocument 对象,反之亦然。

加载 XML 文档

static Cake\Utility\Xml::build($input, array $options = [])

您可以使用 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();
}

注意

DOMDocumentSimpleXML 实现不同的 API。请确保在您从 Xml 请求的对象上使用正确的方法。

加载 HTML 文档

HTML 文档可以使用 loadHtml() 解析为 SimpleXmlElementDOMDocument 对象

$html = Xml::loadHtml($htmlString, ['return' => 'domdocument']);

默认情况下,实体加载和大型文档解析被禁用。这些模式可以通过 loadEntitiesparseHuge 选项分别启用。

将 XML 字符串转换为数组

static Cake\Utility\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

将数组转换为 XML 字符串

$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()