如果同一个标签有多个值,如何根据XML的内容在SimpleXML中编辑XML文件?

问题描述 投票:0回答:2

假设我有一个像这样的XML文件。

<users>
  <user>
    <username>desbest</username>
    <email>[email protected]</email>
    <password>testpass1</password>
  </user>
  <user>
    <username>demo</username>
    <email>[email protected]</email>
    <password>demo</password>
  </user>
</users>

如何使用XPath选择desbest用户,然后使用php编辑desbest用户下的密码,并将其保存为文件?

我搜索了Google和Stack Overflow,但我还没有找到答案。

这是我目前的代码。

// print_r($xml);
$newpass = "mynewpass";
// $newpass = password_hash($newpass, PASSWORD_DEFAULT);
$nodes = $xml->xpath(sprintf(" //users/user[(username = \"$myusername\")] ")); 
// print_r($nodes);
// $nodes[0]->password = "$newpass";
$domnode = dom_import_simplexml($nodes[0]);
$nodepath = $domnode->getNodePath();
// $xml = $xml->$nodepath->password = $newpass;

// $danodepath = $nodes[0]->getNodePath();

// print_r($nodes);
// $xml->users->user["(username = \"$myusername\")"] = "$newpass";
print_r($xml);
echo "<hr>";
print_r($nodepath);
php xml simplexml
2个回答
2
投票

你可以用SimpleXML实现这一点 - 你根本不需要涉及DOMDocument

xpath方法返回您正在寻找的<user>元素。然后,您可以通过更新密码属性(或添加新的属性或属性等)来修改它。这会更新底层的SimpleXMLElement对象,然后您可以使用asXML将其作为字符串写回文件。

$filename = 'file.xml';
$sxml = simplexml_load_file($filename);

$username = "desbest";
$user = $sxml->xpath("./user[./username = '{$username}']")[0];
$user->password = 'testpassCHANGED';

file_put_contents($filename, $sxml->asXML());

有关示例,请参阅https://eval.in/923654


0
投票

DOMDocument的示例:

$source = '<users>
  <user>
    <username>desbest</username>
    <email>[email protected]</email>
    <password>testpass1</password>
  </user>
  <user>
    <username>demo</username>
    <email>[email protected]</email>
    <password>demo</password>
  </user>
</users>';

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($source);

$xpath = new DOMXPath($dom);

$myusername = htmlspecialchars("desbest", ENT_XML1 | ENT_QUOTES, 'UTF-8');
$expression = sprintf('/users/user[(username="%s")]', $myusername);

$users = $xpath->query($expression);
if($users->length) {
    $user = $users->item(0);
    $password = $xpath->query('password', $user)->item(0);
    $password->nodeValue = 'new password';
}

file_put_contents('filename.xml', $dom->saveXML());
© www.soinside.com 2019 - 2024. All rights reserved.