【问题标题】:Export XML from form data [closed]从表单数据导出 XML [关闭]
【发布时间】:2013-07-11 22:31:19
【问题描述】:

我正在尝试提出一个将表单数据导出为 XML 格式的通用例程。目标是使其足够通用,以使表单元素 ID 用作 XML 节点,而表单值显然是节点内容。到目前为止,这是我所拥有的:

if(isset($_POST['submit'])) {
 $doc = new DOMDocument('1.0');
 $doc->formatOutput = true;
 $post = $_POST;
 unset($post['submit']);
 $data = array_values($post);
 $headers = array_keys($post);
 /* TODO - wrap next two lines with if clause */
 /* to check for existing root node */
 $root = $doc->createElement('student');
 $root = $doc->appendChild($root);

 for ($i = 0; count($headers) - 1; $i++)    {
    /* Create and append node for each form element to root */
    $theNode = $doc->createElement($headers[$i]);
    $theNode = $root->appendChild($theNode);

    /* Add content to node */
    $theValue = $doc->createTextNode($data[$i]);
    $theValue = $theNode->appendChild($theValue);
 }
 $fh = fopen($file, 'w') or die("Can't open the XML file.");
 fwrite($fh, $doc->saveXML());
 fclose($fh);
 header('Location: thanks.php'); 
}

并且,根据要求,这是表单代码,尽管我认为这无关紧要:

          <form name="form1" method="post" action="">
        <p>
          <label for="name">Name: </label>
          <input type="text" name="name" id="name" placeholder="Your full name" autofocus required>
        </p>
        <p>
          <label for="email">Email: </label>
          <input type="email" name="email" id="email">
        </p>
        <p>
          <label for="cell">Cell: </label>
          <input type="tel" name="cell" id="cell">
        </p>
        <p>
          <label for="dob">Date of birth: </label>
          <input type="date" name="dob" id="dob">
        </p>
        <p>
          <label for="study">Years of art study: </label>
          0 <input type="range" name="study" id="study" min="0" max="16"> 16
        </p>
        <p style="text-align: center;">
          <input type="submit" name="submit" id="submit" value="Submit">
        </p>
      </form>

不幸的是,此代码导致 HTTP 错误 500。关于我做错了什么有什么想法吗?

哦,正如 TODO 所指出的,我还需要确定文件中是否已经存在数据(存在根节点),只需追加而不重新插入根节点。如何测试 XML 文件中的根节点?

非常感谢您的帮助 - 乔

【问题讨论】:

  • 该代码中的哪一行引发了 HTTP 500 错误?你能有你的表格代码吗?这将有助于我们帮助您。
  • 添加了表单代码,虽然我不认为它应该有所作为。到目前为止,看起来问题(或更可能是第一个问题)在于: $theNode = $doc->createElement($headers[$i]);
  • A 500 Internal Sever Error总是查看服务器错误日志的邀请。它包含更多信息。由于这是 PHP,也很有可能是由于 PHP 中的致命错误,因此确保启用 PHP 错误日志并查看 PHP 错误日志也非常有用。 More about the 500 Internal Server Error
  • 这个问题似乎是题外话,因为它是关于 500 内部服务器错误而没有显示相关日志文件。

标签: php xml domdocument


【解决方案1】:

这里有一个代码 sn-p 可以解决您问题的第一部分。我添加了一个带有虚拟值的硬编码$_POST 来模拟您的表单提交:

<?php
$_POST = array(
    'submit' => true,
    'name'   => 'Name',
    'email'  => 'Email',
    'cell'   => 'Cell',
    'dob'    => 'Date of birth',
    'study'  => 'Years of art study'
);

if(isset($_POST['submit'])) {
    $doc               = new DOMDocument('1.0');
    $doc->formatOutput = true;
    $root              = $doc->createElement('student');
    $root              = $doc->appendChild($root);

    $post = $_POST;
    unset($post['submit']);

    foreach ($post as $key => $value) {
        $node = $doc->createElement($key, $value);
        $root->appendChild($node);
    }

    echo $doc->saveXML();
}

输出:

<?xml version="1.0"?>
<student>
  <name>Name</name>
  <email>Email</email>
  <cell>Cell</cell>
  <dob>Date of birth</dob>
  <study>Years of art study</study>
</student>

对于问题的第二部分,DOMDocument::saveXML 函数不会提示您下载文件或将文件保存到磁盘,而是如其描述所述:

DOMDocument::saveXML — 将内部 XML 树转储回字符串

假设您希望能够下载生成的 XML,请在 SO:How do I create an XML file with php and have it prompt to download? 中查看此问题的答案。

【讨论】:

  • 是的 - 谢谢!我已经编辑了条目以显示如何写出文件。仍在寻找解决 TODO 问题 - 似乎它可能在 simplexml();还在寻找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多