【问题标题】:modify my xml file via php form通过php表单修改我的xml文件
【发布时间】:2017-02-14 11:05:19
【问题描述】:

这是我的 xml 文件和下面的 php 代码。我已经输入了一个输入类型,它将按名字搜索学生。然后将出现有关特定学生的信息,并会出现另一个按钮更新。

问题是我想在那之后修改信息。如何通过标签名称获取元素,以便修改特定学生的信息?

<students>
  <student>
    <firstname>John</firstname>
    <lasttname>Snow</lasttname>
    <student_id>160600</student_id>
    <gender>male</gender>
    <dob>23-06-95</dob>
    <email>JohnSnow@gmail.com</email>
    <mobilenumber>57675060</mobilenumber>
    <address>albatros, portlouis</address>
    <cohort>BSE15PT</cohort>
    <programme>Software Engineering</programme>
    <mode>PT</mode>
  </student>
  <student>
    <firstname>Jey</firstname>
    <lastname>Lacroix</lastname>
    <student_id>150501</student_id>
    <gender>M</gender>
    <dob>1990-02-22</dob>
    <email>Jey@hotmail.com</email>
    <mobilenumber>57553536</mobilenumber>
    <address>Curepipe</address>
    <cohort>BSE15AFT</cohort>
    <programme>software engineering</programme>
    <mode>FT</mode>
  </student>
</students>
    <?php
    if(isset($_POST['search']))
{
    $xml=simplexml_load_file("studentInstance.xml") or die("Error: Cannot Create Object");

    //query the document
    $name = $_POST['studentname'];

    //$xml = simplexml_load_string($xml);
    $query = $xml->xpath("/students/student[firstname = '$name']");
    $array=$query;
    //echo "<pre>";
    //rint_r($array);
    //echo "</pre>";

    $count=0;
    $size=count($array);
    //echo $count;
    echo "<center>";
    while($count!=count($array)){
    foreach ($array[$count]->children() as $child) {//stores  values in child
        $getElementTag=$child->getName();//get tag so nom
        echo '<label>'.$getElementTag.'</label>'." ";
        echo '<input type="text" value= " '.$child.' " size="30"></intput>';
        echo "<br>";
        echo "<br>";
    }
        $count++;
    }

    echo '<input type="submit" name="modify" value="Update Record">'.'<br>';



echo "***************************";
echo "</center>";
    }

?>
<!DOCTYPE html>
<html>
    <head>
        <title>Searching</title>

    </head>
    <body>
<center>
    <form method="POST" action="searchtest.php">
        <label>Enter Student Name</label>
         <input type="text" name="studentname" pattern="[A-Z][a-z]+" title="Must start with capital letters!"  required><br>
         <br>
        <input type="submit" name="search" value="search">
        </form>
    </center>


    </body>
</html>

【问题讨论】:

    标签: php xml xpath xml-parsing


    【解决方案1】:

    考虑一个动态的XSLT(用于修改 XML 文档的转换语言),其中表单值被传递给 XSLT 脚本。但是,当前脚本中必须更改几项:

    1. 您需要&lt;form&gt; 标签来启动$_POST 数组并将值发送到服务器端。在下方添加所需的操作
    2. 您需要为每个&lt;input&gt; 指定一个您已经使用$getElementTag 拥有的独特名称。考虑清理服务器端的 $_POST 值。
    3. 您需要一个隐藏的输入字段来保留旧的名字,以防用户更改此值。此字段很重要,因为它在 XSLT 中用于选择要更新的适当 &lt;student&gt; 节点。

    PHP脚本

    以下脚本仅包含两个 if (isset(...) 条件。集成到您的完整脚本中,并确保回声不会出现在 &lt;html&gt;&lt;head&gt; 上方。此外,还包括嵌入式 XSLT 字符串。请务必在 .ini 文件中启用 XSLTProcessor 扩展名(php_xsl.dll 或 php_xsl.so)。

    <?php
    
    $xml=simplexml_load_file($cd."/FormInput.xml") or die("Error: Cannot Create Object");
    
    if (isset($_POST['modify'])) {    
    
        $oldfirstname=($_POST['oldfirstname']);       
        $firstname=($_POST['firstname']);
        $lastname=($_POST['lastname']);
        $student_id=($_POST['student_id']);
        $gender=($_POST['gender']);
        $dob=($_POST['dob']);
        $email=($_POST['email']);
        $mobilenumber=($_POST['mobilenumber']);
        $address=($_POST['address']);
        $cohort=($_POST['cohort']);
        $programme=($_POST['programme']);
        $mode=($_POST['mode']);
    
        $xslstr = '<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                   <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
                   <xsl:strip-space elements="*"/>
    
                        <xsl:template match="@*|node()">
                          <xsl:copy>
                            <xsl:apply-templates select="@*|node()"/>
                          </xsl:copy>
                        </xsl:template>
    
                        <xsl:template match="student[firstname=\''.$oldfirstname.'\']">
                            <xsl:copy>
                                <firstname>'.$firstname.'</firstname>
                                <lasttname>'.$lastname.'</lasttname>
                                <student_id>'.$student_id.'</student_id>
                                <gender>'.$gender.'</gender>
                                <dob>'.$dob.'</dob>
                                <email>'.$email.'</email>
                                <mobilenumber>'.$mobilenumber.'</mobilenumber>
                                <address>'.$address.'</address>
                                <cohort>'.$cohort.'</cohort>
                                <programme>'.$programme.'</programme>
                                <mode>'.$mode.'</mode>
                            </xsl:copy>
                        </xsl:template>
    
                    </xsl:transform>';
    
        $xsl = new DOMDocument;
        $xsl->loadXML($xslstr);
    
        // Configure the transformer
        $proc = new XSLTProcessor;
        $proc->importStyleSheet($xsl); 
    
        // Transform XML source
        $newXml = $proc->transformToXML($xml);
    
        // Save into new file
        file_put_contents($cd."/FormInput_php.xml", $newXml);
    }
    
    if(isset($_POST['search'])) {
        //query the document
        $name =  $_POST['studentname'];
    
        $query = $xml->xpath("/students/student[firstname = '$name']");
        $array=$query;
    
        $count=0;
        $size=count($array);
    
        echo "<center>";
        echo '<form id="contactform" name="contactform" method="post">';    
        while($count!=count($array)){
            foreach ($array[$count]->children() as $child) {
                $getElementTag=$child->getName();
                echo '<label>'.$getElementTag.'</label>'." ";
                echo '<input type="text" name="'. $getElementTag .'" value= "'.$child.'" size="30"></intput>';
                echo "<br>";
                echo "<br>";
            }
            $count++;
        }
        echo '<input type="hidden" name="oldfirstname" value="'.$name.'"></input>';
        echo '<input type="submit" name="modify" value="Update Record">'.'<br>';
    
    
    echo "</form>";
    echo "***************************";
    echo "</center>";
    }
    
    ?>
    

    HTML输入

    XML 输出

    (新文件不会覆盖现有文件,看看 Jess StackOverflow 如何替换旧的 John Snow)

    <?xml version="1.0" encoding="UTF-8"?>
    <students>
      <student>
        <firstname>Jess</firstname>
        <lasttname>Stackoverflow</lasttname>
        <student_id>999999</student_id>
        <gender>female</gender>
        <dob>10-05-16</dob>
        <email>JStackoverflow@example.com</email>
        <mobilenumber>7777777</mobilenumber>
        <address>Example, Place</address>
        <cohort>HGJD13D</cohort>
        <programme>Web development</programme>
        <mode>FT</mode>
      </student>
      <student>
        <firstname>Jey</firstname>
        <lastname>Lacroix</lastname>
        <student_id>150501</student_id>
        <gender>M</gender>
        <dob>1990-02-22</dob>
        <email>Jey@hotmail.com</email>
        <mobilenumber>57553536</mobilenumber>
        <address>Curepipe</address>
        <cohort>BSE15AFT</cohort>
        <programme>software engineering</programme>
        <mode>FT</mode>
      </student>
    </students>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多