我有一个脚本,它使用 CURL 收集 4 个 URL (XML),并返回一个包含 4 个项目的数组,每个项目包含 URL 的结果。
这是数组:
array(3) {
[0]=>
string(41772) "<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
<created_at>Tue Mar 30 20:58:53 +0000 2010</created_at>
<id>11328253513</id>
<text>...</text>
<source...</source>
<truncated>false</truncated>
<in_reply_to_status_id></in_reply_to_status_id>
<in_reply_to_user_id></in_reply_to_user_id>
<favorited>true</favorited>
<in_reply_to_screen_name></in_reply_to_screen_name>
<user>
<id>1...</id>
<name>....</name>
</status>
</statuses>
"
[1]=>
string(20630) "<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
<status>
<created_at>Sun Feb 28 14:12:30 +0000 2010</created_at>
<id>...</id>
<text>...</text>
<source><a
etc...
如何轻松地从数组中输出 XML?我还需要将 3 个 XML 结构合并为一个,其中 <statuses>
在每个数组之间开始和结束。
最佳答案
一个可能的想法是:
- 创建一个新的
$destination
DOMDocument
的实例- 使用
<statuses>
对其进行初始化节点
- 使用
- 对于 3 个 XML 字符串中的每一个:
- 将其加载到
DOMDocument
的另一个实例:$currentDocument
- 找到
<status>
节点,带有$currentDocument->getElementsByTagName
或等效的 - 导入
<status>
您刚刚找到的节点到$destination
文档,带有$destination->importNode
- 将其加载到
- 当每个 XML 字符串的循环完成后,
$destination
文档应该包含您想要的内容,您可以使用$destination->saveXML
保存它。
这是一个快速的代码示例,可以帮助您理解我的意思:
首先,这是 XML 字符串数组 - 我已将它们变得更短,但其想法与您所拥有的相同:
$strings = array(
'<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array"><status>
<id>ID 1</id>
</status></statuses>',
'<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array"><status>
<id>ID 2</id>
</status></statuses>',
'<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array"><status>
<id>ID 3</id>
</status></statuses>',
);
让我们创建目标文档,并放置 <statuses>
其中的标签:
$destination = new DOMDocument();
$destination->formatOutput = true;
$destinationStatuses = $destination->createElement('statuses');
$destination->appendChild($destinationStatuses);
现在,我们循环 3 个 XML 字符串:
foreach ($strings as $str) {
$current = new DOMDocument();
$current->loadXML($str);
$currentStatuses = $current->getElementsByTagName('status');
foreach ($currentStatuses as $currentStatus) {
$destinationStatus = $destination->importNode($currentStatus, true);
$destinationStatuses->appendChild($destinationStatus);
}
}
对于每个字符串,我们:
- 将其加载到新的
DOMDocument
- 查找
<status>
标签 - 对于每个
<status>
标签,将其导入到目标文档 - 并将其添加到其
<statuses>
中标签
最后,如果我们输出新文档的内容:
echo '<pre>' . htmlspecialchars($destination->saveXML()) . '</pre>';
我们得到:
<?xml version="1.0"?>
<statuses>
<status>
<id>ID 1</id>
</status>
<status>
<id>ID 2</id>
</status>
<status>
<id>ID 3</id>
</status>
</statuses>
即我们三个<status>
三个原始字符串已合并到一个 XML 文档中;-)
关于php - 将 XML 数组输出为纯 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554671/