将XML数组输出到纯XML

时间:2010-03-31 16:29:28

标签: 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</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...

如何从数组中轻松输出XML?我还需要将3个XML结构组合成一个<statuses>开始和结束于每个数组之间的结构。

2 个答案:

答案 0 :(得分:2)

可能的想法是:

  • 创建DOMDocument的新$destination实例
    • 使用<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文档; - )

答案 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()

无论你决定使用什么,都不要使用正则表达式。这是走向疯狂的道路。