aaronddm / xml-builder
基于PHP的简单XML构建器
v2.0.3
2022-10-14 19:07 UTC
Requires
- php: >=7.2.0
Requires (Dev)
- ext-xmlwriter: *
- lib-libxml: >=2.6.20
- phpunit/phpunit: ^8.0
- sabre/xml: ^1.4
README
这是一个简单的基于PHP 7.2+的XML构建器库。使用它只需PHP即可轻松生成XML输出。
目录
安装
composer require aaronddm/xml-builder
先决条件
- PHP >=7.2.0
- 如果使用XMLWriter,需要php-xml
基本用法
以下是最基本的该库使用示例。
示例:使用XMLWriter
<?php require_once 'vendor/autoload.php'; use AaronDDM\XMLBuilder\XMLBuilder; use AaronDDM\XMLBuilder\Writer\XMLWriterService; use AaronDDM\XMLBuilder\Exception\XMLArrayException; $xmlWriterService = new XMLWriterService(); $xmlBuilder = new XMLBuilder($xmlWriterService); try { $xmlBuilder ->createXMLArray() ->start('Root') ->addCData('1 First Child First Element', 'This is a test') ->add('First Child Second Element', false) ->start('Second Parent') ->add('Second child 1', null, ['myAttr' => 'Attr Value']) ->add('Second child 2', false) ->start('Third Parent') ->add('Child') ->end() ->end() ->add('First Child Third Element') ->end(); var_dump($xmlBuilder->getXML()); } catch (XMLArrayException $e) { var_dump('An exception occurred: ' . $e->getMessage()); }
输出
string(414) "<?xml version="1.0" encoding="UTF-8"?>
<Root>
<FirstChildFirstElement><![CDATA[This is a test]]></FirstChildFirstElement>
<FirstChildSecondElement>False</FirstChildSecondElement>
<SecondParent>
<Secondchild myAttr="Attr Value"/>
<Secondchild>False</Secondchild>
<ThirdParent>
<Child/>
</ThirdParent>
</SecondParent>
<FirstChildThirdElement/>
</Root>
"
示例:自定义XMLWriter实例
<?php require_once 'vendor/autoload.php'; use AaronDDM\XMLBuilder\XMLBuilder; use AaronDDM\XMLBuilder\Writer\XMLWriterService; $xmlWriter = new \XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->setIndent(true); $xmlWriter->setIndentString(' '); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->writeDtd('html', '-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'); $xmlWriterService = new XMLWriterService($xmlWriter); $xmlBuilder = new XMLBuilder($xmlWriterService); try { $xmlBuilder ->createXMLArray() ->start('Root') ->addCData('1 First Child First Element', 'This is a test') ->add('First Child Second Element', false) ->start('Second Parent') ->add('Second child 1', null, ['myAttr' => 'Attr Value']) ->add('Second child 2', false) ->start('Third Parent') ->add('Child') ->end() ->end() ->add('First Child Third Element') ->end(); var_dump($xmlBuilder->getXML()); } catch (XMLArrayException $e) { var_dump('An exception occurred: ' . $e->getMessage()); }
输出
string(414) "<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<Root>
<FirstChildFirstElement><![CDATA[This is a test]]></FirstChildFirstElement>
<FirstChildSecondElement>False</FirstChildSecondElement>
<SecondParent>
<Secondchild myAttr="Attr Value"/>
<Secondchild>False</Secondchild>
<ThirdParent>
<Child/>
</ThirdParent>
</SecondParent>
<FirstChildThirdElement/>
</Root>
"
遍历数据
您可以使用提供的startLoop
方法轻松添加数据集。
示例:用户列表的XML输出
<?php require_once 'vendor/autoload.php'; use AaronDDM\XMLBuilder\XMLArray; use AaronDDM\XMLBuilder\XMLBuilder; use AaronDDM\XMLBuilder\Writer\XMLWriterService; $users = [ [ 'name' => 'John Doe', 'age' => 32 ], [ 'name' => 'Jane Doe', 'age' => 98 ] ]; $xmlWriterService = new XMLWriterService(); $xmlBuilder = new XMLBuilder($xmlWriterService); $xmlBuilder ->createXMLArray() ->start('Root') ->startLoop('Users', [], function (XMLArray $XMLArray) use ($users) { foreach ($users as $user) { $XMLArray->start('User') ->add('name', $user['name']) ->add('age', $user['age']); } }) ->end() ->end(); var_dump($xmlBuilder->getXML());
输出
string(261) "<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Users>
<User>
<name>John Doe</name>
<age>32</age>
</User>
<User>
<name>Jane Doe</name>
<age>98</age>
</User>
</Users>
</Root>
"
无父元素遍历
您可以使用提供的loop
方法轻松遍历数据列表,而无需为遍历的数据设置parent
元素。
示例:用户列表的XML输出
<?php require_once 'vendor/autoload.php'; use AaronDDM\XMLBuilder\XMLArray; use AaronDDM\XMLBuilder\XMLBuilder; use AaronDDM\XMLBuilder\Writer\XMLWriterService; $users = [ [ 'name' => 'John Doe', 'age' => 32 ], [ 'name' => 'Jane Doe', 'age' => 98 ] ]; $xmlWriterService = new XMLWriterService(); $xmlBuilder = new XMLBuilder($xmlWriterService); $xmlBuilder ->createXMLArray() ->start('Root') ->loop(function (XMLArray $XMLArray) use ($users) { foreach ($users as $user) { $XMLArray->start('User') ->add('name', $user['name']) ->add('age', $user['age']); } }) ->end(); var_dump($xmlBuilder->getXML()); ?>
输出
<Root>
<User>
<name>John Doe</name>
<age>32</age>
</User>
<User>
<name>Jane Doe</name>
<age>98</age>
</User>
</Root>
使用自定义"XMLElementData"类
您可以通过覆盖XMLElementData元素类来实现对数据值的转换,基于传递的类型。为此,您只需扩展XMLElementData类并重写任何您喜欢的方法。
示例:自定义MyXMLElementData类
<?php require_once 'vendor/autoload.php'; use AaronDDM\XMLBuilder\XMLElementData; use AaronDDM\XMLBuilder\XMLBuilder; use AaronDDM\XMLBuilder\Writer\XMLWriterService; use AaronDDM\XMLBuilder\Exception\XMLArrayException; /** * Class MyXMLElementData */ class MyXMLElementData extends XMLElementData { /** * @return mixed */ public function getValue() { $type = $this->getType(); $value = $this->value; if(is_bool($value)) { $type = 'boolean'; } switch($type) { case 'specialType': $value = 'Special Type Value'; break; case 'boolean': $value = ($value) ? 'True' : 'False'; break; } return $value; } } $xmlWriterService = new XMLWriterService(); $xmlBuilder = new XMLBuilder($xmlWriterService); $xmlBuilder->setElementDataClass(MyXMLElementData::class); try { $xmlBuilder ->createXMLArray() ->start('Root') ->addCData('1 First Child First Element', 'This is a test') ->add('First Child Second Element', false) ->start('Second Parent') ->add('Second child 1', null, ['myAttr' => 'Attr Value']) ->add('Second child 2', false) ->start('Third Parent') ->add('Child') ->add('Special Type Child', "1", [], 'specialType') ->end() ->end() ->add('First Child Third Element') ->end(); var_dump($xmlBuilder->getXML()); } catch (XMLArrayException $e) { var_dump('An exception occurred: ' . $e->getMessage()); }
输出
string(482) "<?xml version="1.0" encoding="UTF-8"?>
<Root>
<FirstChildFirstElement><![CDATA[This is a test]]></FirstChildFirstElement>
<FirstChildSecondElement>False</FirstChildSecondElement>
<SecondParent>
<Secondchild myAttr="Attr Value"/>
<Secondchild>False</Secondchild>
<ThirdParent>
<Child/>
<SpecialTypeChild>Special Type Value</SpecialTypeChild>
</ThirdParent>
</SecondParent>
<FirstChildThirdElement/>
</Root>
"
运行测试
cd /root/of/project/
vendor/bin/phpunit
或者
docker build -t xmlbuilder .
docker run -u appuser -it --rm xmlbuilder vendor/bin/phpunit
许可证
此项目是开源软件,许可协议为MIT。