dbrisinajumi/array2xml

数组到XML转换类

0.9 2018-01-30 09:25 UTC

This package is auto-updated.

Last update: 2024-09-07 20:49:25 UTC


README

Array2xml 是一个PHP库,可以将数组转换为有效的XML。

基于XMLWriter

要求

  • PHP 5.3+
  • XMLWriter

安装

require_once ('/path/to/array2xml.php');

用法(例如:RSS最新新闻)

加载库并设置自定义配置

$array2xml = new Array2xml();
$array2xml->setRootName('rss');
$array2xml->setRootAttrs(array('version' => '2.0'));
$array2xml->setCDataKeys(array('description'));

首先创建一个根元素

$data['channel']['title']        = 'News RSS';
$data['channel']['link']         = 'http://yoursite.com/';
$data['channel']['description']  = 'Amazing RSS News';
$data['channel']['language']     = 'en';

现在循环传递DB查询中的元素

$row = $db->lastNews();
foreach($row as $key => $lastNews)
{
	$data['channel'][$key]['item']['title']       = $lastNews->title;
	$data['channel'][$key]['item']['link']        = 'http://yoursite.com/news/'.$lastNews->url;
	$data['channel'][$key]['item']['description'] = $lastNews->description;
	$data['channel'][$key]['item']['pubDate']     = date(DATE_RFC1123, strtotime($lastNews->added));
}

您还可以单独设置元素属性。以下示例向item节点附加属性AttributeName

$data['channel'][$key]['item']['@attributes'] 		= array('AttributeName' => $attributeValue);

或者,如果您的节点没有子节点,您可以使用这个

$data['channel]['@attributes'] = array('AttributeName' => $attributeValue);
$data['channel]['@content']    = 'Content of channel node';

这将设置channel节点的属性和内容。

或者,您可以使用setElementsAttrs()方法

$array2xml->setElementsAttrs( array('ElementName' => array('AttributeName' => $attributeValue) ));

请注意,在这种情况下,所有指定名称的元素都将具有相同的属性名称和值。

如果您需要在某个地方包含原始XML树,请使用$array2xml->setRawKeys(array('elementName'))标记其元素

最后,将输出数据转换为屏幕

echo $array2xml->convert($data);

配置

您可以使用下面的设置器轻松配置此库以适应您特定的用例。

setVersion(string $version)

设置XML版本头。

setEncoding(string $encoding)

设置XML编码

setRootName(string $rootName)

设置XML根元素名称

setRootAttrs(array $rootAttrs)

设置XML根元素属性

setElementsAttrs(array $attrs)

设置匹配给定名称的每个XML元素的属性。示例参数:['elementName' => ['someAttr' => 'attrValue']]

setCDataKeys(array $elementNames)

标记给定元素为CData类型

setRawKeys(array $elementNames)

标记给定元素为原始类型

setNumericTagPrefix(string $prefix)

设置数字节点的默认前缀

setSkipNumeric(bool $skipNumeric)

开启/关闭跳过数字节点

setEmptyElementSyntax(const)

在某些情况下,您可能想要控制空元素的精确语法。

默认情况下,空或等于null的节点使用自闭合语法(<foo/>)。

您可以使用Array2xml::EMPTY_FULL重写此行为,以强制使用闭合标签(<foo></foo>)。

可用参数为Array2xml::EMPTY_SELF_CLOSINGArray2xml::EMPTY_FULL

setFilterNumbersInTags(bool|array $data)

从元素名称中删除数字。

可能的参数是

  • boolean TRUE 从所有元素中删除数字
  • array 包含需要过滤的节点名称。

这是一个简单的解决方案,以便在从数组构建的XML中具有相同名称的元素。

例如,让我们构建一个包含3个image节点的XML

//list of our images
$images = array('image1.jpg', 'image3.jpg', 'image3.jpg');
// input array
$data = array(); 
for($i=0;$i<3;$i++){
	$data['image'.$i] = $images[$i];
}
$array2xml = new array2xml();
$array2xml->setFilterNumbersInTags(array('image'));

$xml = array2xml->convert($data);

就是这样!现在我们有一个包含3个同名称节点的讨厌的XML。

测试

phpunit Tests/Array2xmlTest.php