XML 和 PHP - 如果节点存在,则覆盖数据,如果不存在,则创建一个新数据


XML and PHP - If node exists, overwrite the data, if not, create a new one

我正在使用HTML5画布,PHP和XML的混合构建器来构建某种签名生成器。我需要的是,当在该输入中键入的"名字"已经存在于XML文件中时,它会检测它是否已经存在于XML文件中,并通过确认javascript窗口询问我是否要替换该部分,或取消。如果输入的"名字"是新的,并且它还没有在xml文件中,它将自动创建一个包含输入数据的新部分。

这是我的HTML代码(仅限表单部分)

<form name="signature">
First name:<input type="text" name="firstname">
Last name:<input type="text" name="lastname">
<button type="submit">Save</button>
</form>

我的PHP代码:

<?php
$xml = simplexml_load_file('test2.xml');
$fname = $_POST['firstname'];
$lname = $_POST['lastname'];
$xml->signature = "";
$xml->signature->fname = $fname;
$xml->signature->lname = $lname;
if(isset($xml->signature->fname = $fname)) { 
echo "<script type='text/javascript'>return confirm('This first name already exists, overwrite it?');</script>";
} else {
    echo "<script type='text/javascript'>alert($fname + ' saved as a new signature');</script>";
}
$doc->save('test2.xml');
?>

还有我的XML结构代码:

<?xml version="1.0" encoding="UTF-8"?>
<signatures>
  <signature>
    <fname>John</fname>
    <lname>Doe</lname>
  </signature>
    <signature>
    <fname>Bob</fname>
    <lname>Funny</lname>
  </signature>
</signatures>

例如,如果我在表单中输入"John Testing",它需要检测到XML文件中已经有一个"John",所以它会问我是否要用John Testing替换当前保存的John Doe。例如,如果我输入"Denis Tester",由于没有Denis,XML文件将变为:

<?xml version="1.0" encoding="UTF-8"?>
<signatures>
  <signature>
    <fname>John</fname>
    <lname>Doe</lname>
  </signature>
    <signature>
    <fname>Bob</fname>
    <lname>Funny</lname>
  </signature>
  <signature>
    <fname>Denis</fname>
    <lname>Tester</lname>
  </signature>
</signatures>

我做了一些研究,我很漂亮,我需要使用 isset 函数来扫描 XML 文件。但我无法让它工作。多谢!

$fname = "John";
$lname = "Testing";
// find with xpath point to signature which fname is equal what we want
$signs = $xml->xpath('//signature[fname = "'.$fname.'"]');
// if (count($signs) > 1)  // What to do if some Johns found ?
if (count($signs) == 1) $signs[0]->lname = $lname;           // Found one element
else {                                                       // Not found - add
   $sign = $xml->addChild('signature');                      // Add signature child to root element
   $sign->addChild('fname', $fname);                         // Add names as cildren of signature
   $sign->addChild('lname', $lname); 
   }