jeckerson/array2xml

数组 -> XML 转换类

资助包维护!
jeckerson

v1.0.0 2020-08-06 20:36 UTC

This package is auto-updated.

Last update: 2024-09-07 05:23:52 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';

现在循环从数据库查询传递元素

$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));
}

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

$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