mehr-it/easy-xml

为大文件提供简单的 XML 处理(读取/写入)

2.2.0 2024-02-07 19:29 UTC

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 编码。移除了自动编码转换以提高性能。