我正在努力想出一个将表单数据导出为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文件中测试根节点?
非常感谢你的帮助 - 乔
答案 0 :(得分:1)
这是一个代码片段,可以解决问题的第一部分。我添加了一个带有虚拟值的硬编码$_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>
对于问题的第2部分,DOMDocument::saveXML函数不会提示您下载文件或将文件保存到磁盘,而是描述如下:
DOMDocument :: saveXML - 将内部XML树转储回字符串
假设您希望能够下载生成的XML,请在SO:How do I create an XML file with php and have it prompt to download?中查看此问题的答案。