spatie/array-to-xml

将数组转换为xml

3.3.0 2024-05-01 10:20 UTC

README

Latest Version Software License Tests Total Downloads

此包提供了一个非常简单的类,用于将数组转换为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>&lt;h1&gt;Sauron&lt;/h1&gt;</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)。有关更多信息,请参阅许可文件