如何从php:// input中删除XML版本

时间:2016-01-19 10:14:46

标签: php xml fopen

我们有一个PHP脚本,它以下列格式接收XML数据:

<?xml version="1.0" encoding="utf-8"?>

<job>
 <job_reference>123</job_reference>
 <job_description>Lorem ipsum.</job_description>
 <job_title>IT Manager</job_title>
 etc...
</job>

脚本当前将其写入文件,替换现有数据。但是我们现在需要它附加到现有数据,但显然我们只能有一个<?xml version="1.0" encoding="utf-8"?>或XML文件无效。我知道我需要将fopen模式从'w'更改为'a',但是如何从$xml中删除XML版本行。目前的代码是:

<?php
  $xml = file_get_contents('php://input');
  $data = $xml;
  $file = fopen( 'broadbeantesttest.xml', "w") or exit("Unable to open file!");
  // Write $somecontent to our opened file.
  if (fwrite($file, $xml) === FALSE) {
      echo "Cannot write to file ($file)";
      exit;
  }
  fclose($file);
?>

4 个答案:

答案 0 :(得分:2)

您可以使用str_replace()删除它:

$xmlString = file_get_contents('php://input');
$xmlString = str_replace('<?xml version="1.0" encoding="utf-8"?>', '', $xmlString);
file_put_contents("broadbeantesttest.xml", $xmlString, FILE_APPEND);

答案 1 :(得分:0)

这是我最后的代码,我唯一可能改变的是限制可以包含的工作数量,但我们不会预料到会有大量数据:

<?php
   $new = file_get_contents('php://input');
   $new = str_replace('<?xml version="1.0" encoding="UTF-8"?>', '', $new);
   $filename = "broadbean.xml";
   $handle = fopen($filename, "r");
   $old = fread($handle, filesize($filename));
   $old = str_replace('</jobs>', '', $old);
   $jobs = '</jobs>';
   $xml = $old . $new . "\r" . $jobs;
   $data = $xml;

   // Write XML File and update
   $file = fopen( 'broadbean.xml', "w") or exit("Unable to open file!");
   // Write $somecontent to our opened file.
    if (fwrite($file, $xml) === FALSE) {
        echo "Cannot write to file ($file)";
        exit;
    }
    fclose($file);
?>

答案 2 :(得分:0)

如果是XML,则应使用XML API来处理它。这将确保您正在阅读和编写有效的XML。它也将照顾字符集/编码。

XML只能有一个文档元素节点。附加请求数据将生成XML片段,而不是XML文档。你需要在顶层有jobs之类的东西。

XML文件可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<jobs>
  <job>
   <job_reference>123</job_reference>
   <job_title>IT Manager</job_title>
  </job>
</jobs>

请求正文中的XML只包含一个job,因此它可以是:

<?xml version="1.0" encoding="utf-8"?>
<job>
 <job_reference>456</job_reference>
 <job_title>Programmer</job_title>
</job>

您需要加载这两个文档并将请求数据中的job元素导入目标文档。将其附加到jobs元素并保存。

$storage = new DOMDocument();
$storage->load($fileName);

$input = new DOMDocument();
$input->loadXml(file_get_contents('php://input'));

$storage->documentElement->appendChild(
  $storage->importNode($input->documentElement, TRUE)
);

$storage->save($fileName);

答案 3 :(得分:0)

在DOMdocument中转换它并将其返回XML格式;

$temp_xml = new DOMDocument();
$temp_xml->loadXML($your_xml);
$your_xml = $t_xml->saveXML($temp_xml->documentElement);