如何使用php检查xml节点的数量并在超过10个时删除

如何使用php检查xml节点的数量并在超过10个时删除,php,xml,forms,count,nodes,Php,Xml,Forms,Count,Nodes,我创建了一个上传表单,可以将名称添加到xml中,但我想检查名称节点的数量,如果有10个,则删除第10个,并在顶部添加一个新的名称节点 我的html是 <form name="form" id="form" action="insert.php" method="post" > <label for="name">Name:</label> <br /> <input type="text" name="name" id="name

我创建了一个上传表单,可以将名称添加到xml中,但我想检查名称节点的数量,如果有10个,则删除第10个,并在顶部添加一个新的名称节点

我的html是

<form name="form" id="form" action="insert.php" method="post" >    
<label for="name">Name:</label> <br />  
<input type="text" name="name" id="name" /> <br />    
<button type="submit" id="button">Submit</button> 
</form> 

名称:

提交
而insert.php是

<?php 

header('Location:index.php'); 

$xmldoc = new DOMDocument(); 
$xmldoc->load('names.xml'); 

$Name = $_POST['name']; 

$root = $xmldoc->firstChild;

$fileName = $xmldoc->createElement('name'); 

$root->appendChild($fileName); 

$newText1 = $xmldoc->createTextNode($Name);

$fileName->appendChild($newText1); 

$xmldoc->save('names.xml');  

?>

它创建names.xml,如下所示:

<?xml version="1.0"?>
<item>
<name>Name1</name>
<name>Name2</name>
<name>Name3</name>
<name>Name4</name>
<name>Name5</name>
<name>Name6</name>
<name>Name7</name>
<name>Name8</name>
<name>Name9</name>
<name>Name10</name>
<name>Name11</name>
etc.

</item>

名称1
姓名2
名字3
名字4
名字5
名字6
姓名7
姓名8
名字9
名字10
名字11
等
但我需要做的是,如果超过10个节点删除它们,则计算名称节点

我该怎么做呢?

像这样:

$dom = new DOMDocument;
$dom->loadXML('<?xml version="1.0"?>
<item>
    <name>Name1</name>
    <name>Name2</name>
    <name>Name3</name>
    <name>Name4</name>
    <name>Name5</name>
    <name>Name6</name>
    <name>Name7</name>
    <name>Name8</name>
    <name>Name9</name>
    <name>Name10</name>
    <name>Name11</name>
    <name>Name12</name>
    <name>Name13</name>
    <name>Name14</name>
</item>
');

$xpath = new DOMXPath($dom);

// use: //name[position() > 10]    to remove nodes after the tenth
foreach ($xpath->query('//name[position() < count(//name) - 9]') as $nameNode) {
    $nameNode->parentNode->removeChild($nameNode);
}

echo $dom->saveXML();
$dom=新的DOMDocument;
$dom->loadXML('
名称1
姓名2
名字3
名字4
名字5
名字6
姓名7
姓名8
名字9
名字10
名字11
名字12
名字13
姓名14
');
$xpath=newdomxpath($dom);
//使用://name[position()>10]删除第十个节点之后的节点
foreach($xpath->query('//name[position()parentNode->removeChild($nameNode);
}
echo$dom->saveXML();
输出

<item>
  <name>Name5</name>
  <name>Name6</name>
  <name>Name7</name>
  <name>Name8</name>
  <name>Name9</name>
  <name>Name10</name>
  <name>Name11</name>
  <name>Name12</name>
  <name>Name13</name>
  <name>Name14</name>
</item>

名字5
名字6
姓名7
姓名8
名字9
名字10
名字11
名字12
名字13
姓名14

PHP的DOM类具有用于和的方法

在它们之间,这些方法应该给你你想要的。像这样的事情应该可以做到:

$names = $xmlDoc->getElementsByTagName('name');

if($names->length > 10) {
    $firstname = $xmlDoc->getElementsByTagName('name')->item(0);
    $removedname = $xmlDoc->removeChild($firstname);
}

(注意:还没有测试过,所以你可能需要调整一下!)

“删除它们”如何删除它们?旧名字还是新名字?你想有一个旋转的名字窗口吗?在寻求帮助之前,你需要弄清楚你想要什么。什么是不起作用的解决方案?如果node.length大于10,请删除第10个之后的删除节点。我使用jQueryAjax加载xml文件,只希望显示最后10个。我知道如何使用jquery实现这一点,但我不希望它继续加载一个xml文件,该文件中存储了1000个名称,并且需要一段时间才能加载。我想要的是,当加载xml时,如果node.length<10 do nothing is node.length>10删除存储的最后一个节点或其之后的所有内容,它将计算名称节点。宾果!这就是生意!:-)