Php 将XML数组输出为普通XML
我有一个脚本,它使用CURL收集4个URL(XML),并返回一个包含4个项目的数组,每个项目包含URL的结果 以下是阵列:Php 将XML数组输出为普通XML,php,Php,我有一个脚本,它使用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</crea
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...
数组(3){
[0]=>
字符串(41772)”
2010年3月30日星期二20:58:53+0000
11328253513
...
一个可能的想法是:
- 创建新的
$destination
实例
- 使用
节点初始化它
- 对于3个XML字符串中的每一个:
- 将其加载到另一个
DOMDocument
:$currentDocument
- 使用
$currentDocument->getElementsByTagName
或等效项查找
节点
- 使用
$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>',
);
现在,我们循环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
- 查找
标记
- 对于每个
标记,将其导入目标文档
- 并将其添加到其
标记中
最后,如果我们输出新文档的内容:
echo '<pre>' . htmlspecialchars($destination->saveXML()) . '</pre>';
echo'.htmlspecialchars($destination->saveXML())。';
我们得到:
ID 1
ID 2
ID 3
i、 e.三个原始字符串中的三个
已合并到一个XML文档中;-)对于这样的简单合并,您也可以执行以下操作:
$xml=内爆(“”,$theArray);
$xml=str_replace(数组(“”,
'',
“,”,“$xml);
$xml=''
. ''
.$xml
. '';
注意:未测试,但基本上它所做的只是将所有XML文档粘合成一个,然后删除XML序言和所有根节点,因此只保留状态节点。然后将它们包装到有效的XML框架中,例如,再次添加序言和根节点。完成
如果您希望以后使用DOM节点,使用DOM将更可靠,因为DOM知道什么是节点,而String函数没有关于它们的线索。如果您决定使用DOM,那么考虑CURL而不是CURL,如Pascal示例中所示,或者使用上面的第一个,然后。
不管你决定使用什么,都不要使用正则表达式。这是一条疯狂之路。Overkill:)但是干净可靠的Overkill。比使用字符串操作更有趣:-p;;;比字符串操作更可靠;;;在其他情况下,会起作用,而字符串/正则表达式操作则不会(即使,是的,我承认,在这种精确的情况下,这有点过分了…)毫无疑问,而且对于勤奋来说+1;):-(我真的在几周前就开始认真地使用DOM了,而且越来越喜欢它^^^比正则表达式容易得多!)是的,一旦你克服了“哦,DOM是如此巨大和困难”的问题“使用stage它非常方便。也比SimpleXml好得多。使用此方法,我可以在$xml@danit你是从另一个问题上解决的还是仍然是一个问题?
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>
$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>';