Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将元素和节点添加到现有xml中_Php_Xml - Fatal编程技术网

Php 将元素和节点添加到现有xml中

Php 将元素和节点添加到现有xml中,php,xml,Php,Xml,我有一个XML文件,其中包括以下内容 <?xml version="1.0"?> <users><user><firstname>ben</firstname><surname>kim</surname <email>benkim@test.com</email></user> <user><firstname>ken</firstname><

我有一个XML文件,其中包括以下内容

<?xml version="1.0"?>
<users><user><firstname>ben</firstname><surname>kim</surname
<email>benkim@test.com</email></user>
<user><firstname>ken</firstname><surname>kim</surname><email>kenkim@test.com</email>   
</user></users>
我想做的是用下面的代码将一个新用户附加到上面的现有XML中。但我根本不工作。你们能看看吗

<?php
    header('Content-Type: text/xml');
?>
<?php
    $firstname = $_GET["firstname"];
    $surname = $_GET["surname"];
    $email = $_GET["email"];

    $person = array("firstname"=>$firstname,"surname"=>$surname,"email"=>$email);

    //ECHO (fromXML());

    $xmlDoc = new DOMDocument();
    $xmlDoc->load("test.xml");
    $xmlDoc=$xmlDoc->documentElement;

    toXml($person);

    function toXml($person)
    {
        $users = $xmlDoc->getElementsByTagName('users');

        $user = $xmlDoc->createElement('user');
        $user = $users->appendChild($user);

        $firstname = $xmlDoc->createElement('firstname'); 
        $firstname = $user->appendChild($firstname);   
        $valFirstname = $xmlDoc->createTextNode($person["firstname"]);
        $valFirstname = $firstname->appendChild($valFirstname);

        $surname = $xmlDoc->createElement('surname'); 
        $surname = $user->appendChild($surname);   
        $valSurname = $xmlDoc->createTextNode($person["surname"]);
        $valSurname = $surname->appendChild($valSurname);

        $email = $xmlDoc->createElement('email'); 
        $email = $user->appendChild($email);   
        $valEmail = $xmlDoc->createTextNode($person["email"]);
        $valEmail = $email->appendChild($valEmail);

        $strXml = $xmlDoc->saveXML();
        $handle = fopen("test.xml", "a");
        fwrite($handle, $strXml);
        fclose($handle);
    }
尝试改用SimpleXML


你有很多问题

首先,$xmlDoc在函数的作用域内不可用。为此,您需要:

将$xmlDoc作为toXml函数的参数传递,这是推荐的 使用global关键字告诉函数需要从全局上下文中获取$xmlDoc,这是不鼓励的 然后,您无法正确获取根节点。在您的情况下,只需使用$xmlDoc->firstChild获取它

然后,需要创建不同的节点,然后将它们插入根节点。这意味着您需要在将元素附加到DOM之前创建这些元素

最后,您将以附加模式a打开test.xml文件。这意味着在保存文档时,实际上会将xml的内容附加到现有内容中,因此文档将无效,因为每次执行脚本时都会有一个新标记

这是您的脚本的更正版本。如果您有任何疑问,请随时提问!:

<?php

$person = array(
    "firstname" => $_GET["firstname"],
    "surname"   => $_GET["surname"],
    "email"     => $_GET["email"],
);

$xmlDoc = new DOMDocument();

$xmlDoc->preserveWhiteSpace = false;
$xmlDoc->formatOutput = true;
$xmlDoc->load("test.xml");

toXml($person, $xmlDoc);

header('Content-Type', 'application/xml');
exit(file_get_contents('test.xml'));

function toXml(array $person, DOMDocument $xmlDoc)
{
    $users = $xmlDoc->firstChild;
    $user = $xmlDoc->createElement('user');

    $firstname = $xmlDoc->createElement('firstname');
    $textNode = $xmlDoc->createTextNode($person["firstname"]);
    $firstname->appendChild($textNode);
    $user->appendChild($firstname);

    $surname = $xmlDoc->createElement('surname');
    $textNode = $xmlDoc->createTextNode($person["surname"]);
    $surname->appendChild($textNode);
    $user->appendChild($surname);

    $email = $xmlDoc->createElement('email');
    $textNode = $xmlDoc->createTextNode($person["email"]);
    $email->appendChild($textNode);
    $user->appendChild($email);

    $users->appendChild($user);

    $strXml = $xmlDoc->saveXML();
    $handle = fopen("test.xml", "w");
    fwrite($handle, $strXml);
    fclose($handle);
}

您的函数存在范围问题$xmlDoc变量在函数的作用域内不可用。将其作为参数传递。还有,这样你就可以发现类似的错误。谢谢你,这真的很有帮助!!您还知道如何确定文件是否已经存在吗?因为如果不存在xml文件,我需要创建xml文件。只需使用模式“w+”,而不是模式“w”:嘿,Charles Sarrazin,你能给我解释一下下面的意思吗?标题'Content-Type:text/xml';exitfile_获取_内容'customer.xml';标题'Content-Type','application/xml';使您的内容被浏览器识别为XML文档。exitfile_get_内容'test.xml';只需退出PHP并显示文件test.xml的内容
<?php

$person = array(
    "firstname" => $_GET["firstname"],
    "surname"   => $_GET["surname"],
    "email"     => $_GET["email"],
);

$xmlDoc = new DOMDocument();

$xmlDoc->preserveWhiteSpace = false;
$xmlDoc->formatOutput = true;
$xmlDoc->load("test.xml");

toXml($person, $xmlDoc);

header('Content-Type', 'application/xml');
exit(file_get_contents('test.xml'));

function toXml(array $person, DOMDocument $xmlDoc)
{
    $users = $xmlDoc->firstChild;
    $user = $xmlDoc->createElement('user');

    $firstname = $xmlDoc->createElement('firstname');
    $textNode = $xmlDoc->createTextNode($person["firstname"]);
    $firstname->appendChild($textNode);
    $user->appendChild($firstname);

    $surname = $xmlDoc->createElement('surname');
    $textNode = $xmlDoc->createTextNode($person["surname"]);
    $surname->appendChild($textNode);
    $user->appendChild($surname);

    $email = $xmlDoc->createElement('email');
    $textNode = $xmlDoc->createTextNode($person["email"]);
    $email->appendChild($textNode);
    $user->appendChild($email);

    $users->appendChild($user);

    $strXml = $xmlDoc->saveXML();
    $handle = fopen("test.xml", "w");
    fwrite($handle, $strXml);
    fclose($handle);
}