spatie / array-to-xml
将数组转换为xml
Requires
- php: ^8.0
- ext-dom: *
Requires (Dev)
- mockery/mockery: ^1.2
- pestphp/pest: ^1.21
- spatie/pest-plugin-snapshots: ^1.1
- dev-main / 3.x-dev
- 3.3.0
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.1
- 3.0.0
- v2.x-dev
- 2.17.1
- 2.17.0
- 2.16.0
- 2.15.1
- 2.15.0
- 2.14.0
- 2.13.0
- 2.12.1
- 2.12.0
- 2.11.2
- 2.11.1
- 2.11.0
- 2.10.0
- 2.9.0
- 2.8.1
- 2.8.0
- 2.7.3
- 2.7.2
- 2.7.1
- 2.7.0
- 2.6.1
- 2.6.0
- 2.5.2
- 2.5.0
- 2.3.0
- 2.2.1
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.0
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.0.1
- dev-dependabot/github_actions/dependabot/fetch-metadata-2.1.0
This package is auto-updated.
Last update: 2024-08-31 00:37:00 UTC
README
此包提供了一个非常简单的类,用于将数组转换为xml字符串。
支持我们
我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡寄来明信片,注明您正在使用我们哪些包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上。
安装
您可以通过composer安装此包。
composer require spatie/array-to-xml
用法
use Spatie\ArrayToXml\ArrayToXml; ... $array = [ 'Good guy' => [ 'name' => 'Luke Skywalker', 'weapon' => 'Lightsaber' ], 'Bad guy' => [ 'name' => 'Sauron', 'weapon' => 'Evil Eye' ] ]; $result = ArrayToXml::convert($array);
运行此代码段后,$result
将包含
<?xml version="1.0"?> <root> <Good_guy> <name>Luke Skywalker</name> <weapon>Lightsaber</weapon> </Good_guy> <Bad_guy> <name>Sauron</name> <weapon>Evil Eye</weapon> </Bad_guy> </root>
设置根元素名称
您可以选择通过作为第二个参数传递来设置rootElement的名称。如果您不指定此参数(或将其设置为空字符串),则使用"root"。
$result = ArrayToXml::convert($array, 'customrootname');
处理键名
默认情况下,您的数组键名中的所有空格都将转换为下划线。如果您想取消此行为,可以将第三个参数设置为false。我们将保留所有键名不变。
$result = ArrayToXml::convert($array, 'customrootname', false);
添加属性
您可以使用名为_attributes
的键来添加属性到节点,并使用_value
来指定值。
$array = [ 'Good guy' => [ '_attributes' => ['attr1' => 'value'], 'name' => 'Luke Skywalker', 'weapon' => 'Lightsaber' ], 'Bad guy' => [ 'name' => 'Sauron', 'weapon' => 'Evil Eye' ], 'The survivor' => [ '_attributes' => ['house'=>'Hogwarts'], '_value' => 'Harry Potter' ] ]; $result = ArrayToXml::convert($array);
此代码将生成
<?xml version="1.0"?> <root> <Good_guy attr1="value"> <name>Luke Skywalker</name> <weapon>Lightsaber</weapon> </Good_guy> <Bad_guy> <name>Sauron</name> <weapon>Evil Eye</weapon> </Bad_guy> <The_survivor house="Hogwarts"> Harry Potter </The_survivor> </root>
注意,_value
字段的值必须是一个字符串。 (更多信息)
使用保留字符
您还可以将节点的值包装在CDATA部分中。这允许您使用保留字符。
$array = [ 'Good guy' => [ 'name' => [ '_cdata' => '<h1>Luke Skywalker</h1>' ], 'weapon' => 'Lightsaber' ], 'Bad guy' => [ 'name' => '<h1>Sauron</h1>', 'weapon' => 'Evil Eye' ] ]; $result = ArrayToXml::convert($array);
此代码将生成
<?xml version="1.0"?> <root> <Good_guy> <name><![CDATA[<h1>Luke Skywalker</h1>]]></name> <weapon>Lightsaber</weapon> </Good_guy> <Bad_guy> <name><h1>Sauron</h1></name> <weapon>Evil Eye</weapon> </Bad_guy> </root>
如果您的输入包含无法解析的内容,将抛出DOMException
。
自定义XML声明
您可以为以下指定特定值
- 编码作为第四个参数(字符串)
- 版本作为第五个参数(字符串)
- DOM属性作为第六个参数(数组)
- 独立作为第七个参数(布尔值)
$result = ArrayToXml::convert($array, [], true, 'UTF-8', '1.1', [], true);
这将生成
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
向根元素添加属性
要向根元素添加属性,请提供第二个参数中具有_attributes
键的数组。然后可以使用rootElementName
键设置根元素名称。
$result = ArrayToXml::convert($array, [ 'rootElementName' => 'helloyouluckypeople', '_attributes' => [ 'xmlns' => 'https://github.com/spatie/array-to-xml', ], ], true, 'UTF-8');
使用多维数组
使用多维数组来创建元素集合。
$array = [ 'Good guys' => [ 'Guy' => [ ['name' => 'Luke Skywalker', 'weapon' => 'Lightsaber'], ['name' => 'Captain America', 'weapon' => 'Shield'], ], ], 'Bad guys' => [ 'Guy' => [ ['name' => 'Sauron', 'weapon' => 'Evil Eye'], ['name' => 'Darth Vader', 'weapon' => 'Lightsaber'], ], ], ];
这将生成
<?xml version="1.0" encoding="UTF-8"?> <helloyouluckypeople xmlns="https://github.com/spatie/array-to-xml"> <Good_guys> <Guy> <name>Luke Skywalker</name> <weapon>Lightsaber</weapon> </Guy> <Guy> <name>Captain America</name> <weapon>Shield</weapon> </Guy> </Good_guys> <Bad_guys> <Guy> <name>Sauron</name> <weapon>Evil Eye</weapon> </Guy> <Guy> <name>Darth Vader</name> <weapon>Lightsaber</weapon> </Guy> </Bad_guys> </helloyouluckypeople>
使用闭包值
此包可以使用闭包值
$users = [ [ 'name' => 'one', 'age' => 10, ], [ 'name' => 'two', 'age' => 12, ], ]; $array = [ 'users' => function () use ($users) { $new_users = []; foreach ($users as $user) { $new_users[] = array_merge( $user, [ 'double_age' => $user['age'] * 2, ] ); } return $new_users; }, ]; ArrayToXml::convert($array)
这将生成
<?xml version="1.0"?> <root> <users> <name>one</name> <age>10</age> <double_age>20</double_age> </users> <users> <name>two</name> <age>12</age> <double_age>24</double_age> </users> </root>
处理数字键
此包还可以处理数字键
$array = [ 100 => [ 'name' => 'Vladimir', 'nickname' => 'greeflas', ], 200 => [ 'name' => 'Marina', 'nickname' => 'estacet', ], ]; $result = ArrayToXml::convert(['__numeric' => $array]);
这将生成
<?xml version="1.0" encoding="UTF-8"?> <root> <numeric_100> <name>Vladimir</name> <nickname>greeflas</nickname> </numeric_100> <numeric_200> <name>Marina</name> <nickname>estacet</nickname> </numeric_200> </root>
您可以通过调用setNumericTagNamePrefix()
设置器方法来更改键前缀。
使用自定义键
此包还可以处理自定义键
$array = [ '__custom:custom-key:1' => [ 'name' => 'Vladimir', 'nickname' => 'greeflas', ], '__custom:custom-key:2' => [ 'name' => 'Marina', 'nickname' => 'estacet', 'tags' => [ '__custom:tag:1' => 'first-tag', '__custom:tag:2' => 'second-tag', ] ], ]; $result = ArrayToXml::convert($array);
这将生成
<?xml version="1.0" encoding="UTF-8"?> <root> <custom-key> <name>Vladimir</name> <nickname>greeflas</nickname> </custom-key> <custom-key> <name>Marina</name> <nickname>estacet</nickname> <tags> <tag>first-tag</tag> <tag>second-tag</tag> </tags> </custom-key> </root>
自定义键包含三个用冒号分隔的部分:"__custom:[custom-tag]:[unique-string]"。
- "__custom"
- 键始终以"__custom"开头。
- 自定义标签
- 要渲染为XML标签的字符串。
- 唯一字符串
- 一个唯一的字符串,避免在PHP数组中重复键的覆盖。
在自定义标签部分可以包含一个冒号字符,通过反斜杠转义
$array = [ '__custom:ns\\:custom-key:1' => [ 'name' => 'Vladimir', 'nickname' => 'greeflas', ], '__custom:ns\\:custom-key:2' => [ 'name' => 'Marina', 'nickname' => 'estacet', 'tags' => [ '__custom:ns\\:tag:1' => 'first-tag', '__custom:ns\\:tag:2' => 'second-tag', ] ], ];
这将生成
<?xml version="1.0" encoding="UTF-8"?> <root> <ns:custom-key> <name>Vladimir</name> <nickname>greeflas</nickname> </ns:custom-key> <ns:custom-key> <name>Marina</name> <nickname>estacet</nickname> <tags> <ns:tag>first-tag</ns:tag> <ns:tag>second-tag</ns:tag> </tags> </ns:custom-key> </root>
设置DOMDocument属性
要设置内部DOMDocument对象的属性,只需传递一个包含键和值的数组。有关有效属性的完整列表,请参阅https://php.ac.cn/manual/en/class.domdocument.php。
您可以使用构造函数来设置DOMDocument属性。
$result = ArrayToXml::convert( $array, $rootElement, $replaceSpacesByUnderScoresInKeyNames, $xmlEncoding, $xmlVersion, ['formatOutput' => true] );
或者您可以使用setDomProperties
$arrayToXml = new ArrayToXml($array); $arrayToXml->setDomProperties(['formatOutput' => true]); $result = $arrayToXml->toXml();
XML美化
在ArrayToXml上调用prettify()
方法来设置美观格式的XML。
示例
$array = [ 'Good guy' => [ 'name' => 'Luke Skywalker', 'weapon' => 'Lightsaber' ], 'Bad guy' => [ 'name' => 'Sauron', 'weapon' => 'Evil Eye' ] ]; $arrayToXml = new ArrayToXml($array);
使用美化
$arrayToXml->prettify()->toXml();
将得到
<?xml version="1.0"?> <root> <Good_guy> <name>Luke Skywalker</name> <weapon>Lightsaber</weapon> </Good_guy> <Bad_guy> <name>Sauron</name> <weapon>Evil Eye</weapon> </Bad_guy> </root>
不使用美化
$arrayToXml->toXml();
将得到
<?xml version="1.0"?> <root><Good_guy><name>Luke Skywalker</name><weapon>Lightsaber</weapon></Good_guy><Bad_guy><name>Sauron</name><weapon>Evil Eye</weapon></Bad_guy></root>
删除XML声明
在ArrayToXml对象上调用dropXmlDeclaration()
方法来在生成的XML顶部省略默认的XML声明。
示例
$root = [ 'rootElementName' => 'soap:Envelope', '_attributes' => [ 'xmlns:soap' => 'http://www.w3.org/2003/05/soap-envelope/', ], ]; $array = [ 'soap:Header' => [], 'soap:Body' => [ 'soap:key' => 'soap:value', ], ]; $arrayToXml = new ArrayToXml($array, $root); $result = $arrayToXml->dropXmlDeclaration()->toXml();
这将生成
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"><soap:Header/><soap:Body><soap:key>soap:value</soap:key></soap:Body></soap:Envelope>
添加处理指令
在ArrayToXml对象上调用addProcessingInstruction($target, $data)
方法来在根元素之前添加一个处理指令。
示例
$arrayToXml = new ArrayToXml($array); $arrayToXml->addProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="base.xsl"'); $result = $arrayToXml->toXml();
这将生成
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="base.xsl"?> <root><Good_guy><name>Luke Skywalker</name><weapon>Lightsaber</weapon></Good_guy><Bad_guy><name>Sauron</name><weapon>Evil Eye</weapon></Bad_guy></root>
测试
vendor/bin/phpunit
变更日志
有关最近更改的更多信息,请参阅CHANGELOG。
贡献
有关详细信息,请参阅CONTRIBUTING。
安全漏洞
有关如何报告安全漏洞的详细信息,请参阅我们的安全策略。
Postcardware
您可以使用此包,但如果它进入您的生产环境,我们非常希望您能从您的家乡寄给我们一张明信片,说明您正在使用我们的哪个包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将在我们的公司网站上发布所有收到的明信片。
鸣谢
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅许可文件。