lucid/xml

XML编写和解析工具

v0.0.1 2016-04-12 19:51 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:09:20 UTC


README

Author Source Code Software License

Build Status Code Coverage HHVM

安装

$ composer require lucid/xml

测试

使用以下命令运行测试

$ ./vendor/bin/phpunit

解析器

Parser 类可以将 xml 字符串、文件、DOMDocuments 和 DOMElements 解析成 PHP 数组。

解析 xml 字符串

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->parse('<data><foo>bar</foo></data>');

解析 xml 文件

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->parse('/path/to/data.xml');

解析 DOMDocument

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->parseDom($dom);

解析 DOMElement

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->parseDomElement($element);

解析器选项

处理属性

XML 属性被捕获为实际节点数据中的一个专用部分。该部分的键默认为 @attributes,但可以使用 setAttributesKey 方法进行更改。

<?php

use Lucid\Xml\Parser;

$xml = '<data><node id="1">some text</node></data>'

$parser = new Parser;
$parser->setAttributesKey('__attrs__');
$parser->parse($xml);
['data' => ['node' => ['__attrs__' => ['id' => 1], 'value' => 'some text']]];

合并属性

设置 Parser::mergeAttributes(true) 将合并任何属性作为键/值合并到数据集中。

$parser->setMergeAttributes(true);
$parser->parse($xml);

上面的示例将输出类似于以下的内容

['data' => ['node' => ['id' => 1, 'value' => 'some text']]];

规范化键

您可以通过设置键规范化回调函数来指定如何转换键。

默认规范化将破折号转换为下划线,并将驼峰式转换为蛇形表示法。

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->setKeyNormalizer(function ($key) {
	// do string transfomations
	return $key;
});

$parser->parseDomElement($element);

设置索引键

这会强制解析器将具有指定键的 nodeName 的节点处理为列表。

<?php

use Lucid\Xml\Parser;

$parser = new Parser;

$parser->setIndexKey('item');

设置复数化器

默认情况下,解析器将解析 XML 结构,例如

<entries>
	<entry>1</entry>
	<entry>2</entry>
</entries>

变为如下所示

<?php

['entries' => ['entry' => [1, 2]]]

设置复数化器可以解决这个问题。

注意,复数化器可以是任何 可调用,它接受一个字符串并返回一个字符串。

<?php

$parser->setPluralizer(function ($string) {
	if ('entry' === $string) {
		return 'entries';
	}
});
<?php
['entries' => [1, 2]]

写入器

将 PHP 数据转储为 XML 字符串

<?php

use Lucid\Xml\Writer;

$writer = new Writer;

$data = [
	'foo' => 'bar'
];

$writer->dump($data); // <root><foo>bar</foo></root>

// set the xml root node name:

$writer->dump($data, 'data'); // <data><foo>bar</foo></data>

将 PHP 数据转储为 DOMDocument

注意:这将创建一个 Lucid\Xml\Dom\DOMDocument 实例。

<?php

use Lucid\Xml\Writer;

$writer = new Writer;

$data = [
	'foo' => 'bar'
];

$dom = $writer->writeToDom($data);

写入器选项

设置规范化实例

通常,当实例化新的 Writer 时,会为您设置 NormalizerInterface 实现,但是您可以设置自己的规范化实例。

注意:规范化必须实现 Lucid\Xml\Normalizer\NormalizerInterface 接口。

<?php

use Lucid\Xml\Writer;
use Lucid\Xml\Normalizer\Normalizer;

$writer = new Writer(new Normalizer);

// or

$writer->setNormalizer($myNormalizer);

设置屈折变化器

屈折变化器是解析器复数化器的完全相反。它将字符串转换为单数。

<?php

$writer->setInflector(function ($string) {
	if ('items' === $string) {
		return 'item';
	}
});

设置文档编码

默认编码为 UTF-8

<?php
$writer->setEncoding($encoding); // string

设置属性键映射

如果您想输出某些键作为 XML 属性,这将很有用。

<?php

$writer->setKeyMap([
	'nodeName' => ['id', 'entry'] // nested keys 'id' and 'entry' of the key
	element 'nodeName' will be set as attributes instead of childnodes.
]);

注意:您还可以使用 addMappedAttribute($nodeName, $attributeName) 添加更多映射属性。

设置值键

<?php

$data = [
	'foo' => [
		'@attributes' => [
			'bar' => 'baz'
		],
		'value' => 'tab'
	]
];

上面的数据结构将转储以下 XML 字符串

<foo bar="baz"><value>tab</value></foo>

但是,如果您需要将值节点作为父节点的实际值,则可以使用 Writer::useKeyAsValue(string $key) 来实现这一点

<?php

$writer->useKeyAsValue('value');

$writer->dump($data);

现在转储

<foo bar="baz">tab</foo>

写入索引数组结构

索引数组将创建如下所示的 XML 结构

$data = ['data' => [1, 2, 3]];
$writer->dump($data);
<data>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</data>

您可以使用 useKeyAsIndex(string $key) 方法更改与索引项相关联的节点名称。

$writer->useKeyAsIndex('thing');
$writer->dump($data);
<data>
	<thing>1</thing>
	<thing>2</thing>
	<thing>3</thing>
</data>

写入具有无效索引键的数组

包含无效索引(例如,无序列表)的数组将被稍微不同地处理。

$data = ['data' => [1 => 'foo', 4 => 'bar', 3 => 'baz']];
$writer->dump($data);
<data>
    <item index="1">foo</item>
    <item index="4">bar</item>
    <item index="3">baz</item>
</data>