Php 将XML数组输出为普通XML

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

我有一个脚本,它使用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>&lt;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>';