mehr-it / easy-xml
为大文件提供简单的 XML 处理(读取/写入)
2.2.0
2024-02-07 19:29 UTC
Requires
- php: >=7.1.0
- ext-libxml: *
- ext-mbstring: *
- ext-xmlreader: *
- ext-xmlwriter: *
- mehr-it/php-decimals: ^2.1
Requires (Dev)
- phpunit/phpunit: ^7.4
README
编写 XML 文件
XMLBuilder
类提供了与 PHP 的 XMLWriter
类相似的 API。实际上,它内部使用了它。但大多数情况下,这种方式生成 XML 并不直观,你的源代码也无法清晰地揭示 XML 结构。
因此,XMLBuilder
提供了一个强大的基于数组的接口,可以在 PHP 代码中揭示 XML 结构。你的源代码一开始就能清楚地表明其目的总是一个好主意。
入门指南
以下示例演示了如何创建具有嵌套节点的基本 XML
$builder = new XMLBuilder();
$builder
->beginDocument()
->write([
'root' => [
'child' => 'content',
'anotherChild' => 15
]);
标签名称由数组键表示。内容由数组值确定
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>content</child>
<anotherChild>15</anotherChild>
</root>
添加属性
要向我们的 XML 节点添加属性,我们使用一个开头的 XML 方括号 ("<") 前缀键,并传递一个以属性名称为键的数组,前缀为 "@"。内容由名为 "@" 的项目定义。或者你可以使用一个数字数组,并使用 ">" 键指定标签名称
$builder->write([
'<root' => [
'@author' => 'Paul'
'@age' => 40,
'@' => [
'<child' => [
'@age' => '4'
'@' => 'Lukas'
],
// alternative syntax:
[
'>' => 'wife',
'@age' => 36,
'@' => 'Lisa'
]
]
]
]);
如你所见,你甚至可以混合定义 XML 节点的不同方法。生成的 XML 将如下所示
<?xml version="1.0" encoding="UTF-8"?>
<root author="Paul" age="40">
<child age="4">content</child>
<wife age="36">Lisa</wife>
</root>
具有相同名称的多个节点
有时你需要定义具有相同名称的多个兄弟节点。有两种方法可以做到这一点。要么将每个节点包装在一个数组中,要么使用 ">" 键来定义标签名称
$builder->write([
'root' => [
['child' => 'Lukas'],
['child' => 'Sophie'],
// alternative syntax:
[
'>' => 'child',
'@' => 'Michael'
],
[
'>' => 'child',
'@' => 'Zoe'
]
]
]);
传递闭包
通常,XML 结构取决于要写入的数据。为了保持流畅的接口并在源代码中保持 XML 的视觉结构,你可以传递一个闭包来生成 XML 的动态部分
$builder->write([
'root' => function(XMLBuilder $bld) use ($person) {
if ($person instanceof Child)
$bld->write(['child' => $person->getName()];
else
$bld->write(['adult' => $person->getName()];
});
升级说明
2.x
- 从 2.x 版本开始,所有提供的路径和属性名称都应使用 UTF-8 编码。移除了自动编码转换以提高性能。