我有一个脚本,它使用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>
开始和结束于每个数组之间的结构。
答案 0 :(得分:2)
可能的想法是:
DOMDocument
的新$destination
实例
<statuses>
节点DOMDocument
:$currentDocument
<status>
节点,$currentDocument->getElementsByTagName
或等效<status>
$destination
节点导入$destination->importNode
文档
$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文档; - )
答案 1 :(得分:1)
对于像这样的简单合并,您也可以这样做:
$xml = implode('', $theArray);
$xml = str_replace(array('<?xml version="1.0" encoding="UTF-8"?>',
'<statuses type="array">',
'</statuses>'), '', $xml);
$xml = '<?xml version="1.0" encoding="UTF-8"?>'
. '<statuses type="array">'
. $xml
. '</statuses>';
注意:未经测试,但基本上它只是将所有XML文档粘合到一个,然后删除XML Prolog和所有根节点,因此只保留状态节点。然后将它们包装到有效的XML骨架中,例如,再次prolog和root节点。完成。
如果您之后想要使用DOM节点,那么使用DOM会更可靠,因为DOM知道哪些节点是什么,而字符串函数对它们没有任何线索。如果您决定使用DOM,请考虑使用loading the documents with load而不是CURL,如Pascal示例中所示 - 或者首先使用上面的load that document from the string with loadXml()。
无论你决定使用什么,都不要使用正则表达式。这是走向疯狂的道路。