mblarsen / array-xml
用于构建XML文件的一种简单而富有表现力的数组语法
0.1.0
2019-11-21 09:53 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8
This package is auto-updated.
Last update: 2024-09-21 21:19:38 UTC
README
因为DOMDocument和SimpleXML很糟糕
- 轻松使用关联数组构建XML
- 简洁的语法用于命名子元素、添加属性等
- 如果确实需要,可以与
DOMDocument
结合使用
示例
- 轻松创建属性
- 子元素默认继承父元素的名字
ArrayToXML::toXML( 'Order@version=2.0' => [ 'ID@type=SKU' => 1234, 'Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ] );
输出
<?xml version="1.0"?> <Order version="2.0"> <ID type="SKU">1234</ID> <Lines> <Line> <item>ABC</item> <qty>3</qty> </Line> <Line> <item>DEF</item> <qty>1</qty> </Line> </Lines> </Order>
- 使用
|
可以指定子元素的名称
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, 'Lines|OrderLine' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ] );
输出
<?xml version="1.0"?> <Order> <ID>1234</ID> <Lines> <OrderLine> <item>ABC</item> <qty>3</qty> </OrderLine> <OrderLine> <item>DEF</item> <qty>1</qty> </OrderLine> </Lines> </Order>
- 使用
name_mappers
可以使用、索引和子值来构建子元素名称和属性
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, 'Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ], [ 'name_mappers' => [ 'Line' => function ($name, $index, $value) { return $name . '@number=' . ($index + 1); } ] ] );
输出
<?xml version="1.0"?> <Order> <ID>1234</ID> <Lines> <Line number="1"> <item>ABC</item> <qty>3</qty> </Line> <Line number="2"> <item>DEF</item> <qty>1</qty> </Line> </Lines> </Order>
- 使用
<
可以将父元素“展开”,并将其子元素放置在其位置
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, // Node names will be 'Line' '<Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ], // Node name will be 'Lines' // (some XSDs actually pluralize 'things' 🤦) '<Foo|Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ], ], );
输出
<?xml version="1.0"?> <Order> <ID>1234</ID> <Line> <item>ABC</item> <qty>3</qty> </Line> <Line> <item>DEF</item> <qty>1</qty> </Line> <Lines> <item>ABC</item> <qty>3</qty> </Lines> <Lines> <item>DEF</item> <qty>1</qty> </Lines> </Order>
- 一些部分难以使用数组来建模,因此可以使用
DOMDocument
进行“修补”
$complex_dom = ...; ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, '<complexdom' => $complexdom ], );
输出
<?xml version="1.0"?> <Order> <ID>1234</ID> <Line number="1"> <item>ABC</item> <qty>3</qty> </Line> <LineComment>Wrap well</LineComment> <Line number="2"> <item>DEF</item> <qty>1</qty> </Line> <LineComment/> </Order>
- 命名空间只是名称的一部分 + 根元素的属性。
ArrayToXML::toXML( 'Order@ns=...@ecom=...' => [ 'ns:ID' => 1234, '<ecom:Lines' => [ ['ecom:item' => 'ABC', 'ecom:qty' => 3], ['ecom:item' => 'DEF', 'ecom:qty' => 1], ] ], );
输出
<?xml version="1.0"?> <ns:Order ns="..." ecom="..."> <ns:ID>1234</ns:ID> <ecom:Line number="1"> <ecom:item>ABC</ecom:item> <ecom:qty>3</ecom:qty> </ecom:Line> <ecom:Line number="2"> <ecom:item>DEF</ecom:item> <ecom:qty>1</ecom:qty> </ecom:Line> </ns:Order>
- 需要使用
DOMDocument
时使用toDOM
ArrayToXML::toDOM( 'Order' => [ 'ID' => 1234, 'Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ] );
- 允许您设置XML的版本和编码
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, 'Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ], [ 'version' => '1.2', 'encoding' => 'utf8' ] );
输出
<?xml version="1.2" encoding="utf8"?> <Order> <ID>1234</ID> <Lines> <Line> <item>ABC</item> <qty>3</qty> </Line> <Line> <item>DEF</item> <qty>1</qty> </Line> </Lines> </Order>
- 将
declare
设置为false将排除XML声明
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, 'Lines' => [ ['item' => 'ABC', 'qty' => 3], ['item' => 'DEF', 'qty' => 1], ] ], [ 'declare' => false ] );
输出
<Order> <ID>1234</ID> <Lines> <Line> <item>ABC</item> <qty>3</qty> </Line> <Line> <item>DEF</item> <qty>1</qty> </Line> </Lines> </Order>
- 方便地创建CDATA
ArrayToXML::toXML( 'Order' => [ 'ID' => 1234, 'Comment' => 'cdata:foo', ] );
输出
<?xml version="1.0"?> <Order> <ID>1234</ID> <Comment><![CDATA[foo]]></Comment> </Order>