2014-02-05 80 views
0

我觉得我的问题会非常简单,但我已经在很多方面尝试过,并且它们都不起作用,我不知道还有什么可以转向。使用PHP删除XML行

我想实现的是:我想从XML文件中删除单个元素。

这种情况:我有一个真正简单构建的XML文件。这将是在未来更复杂的,但现在它看起来像这样:

XML

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
</list> 

显示到一个HTML页面此列表。现在,当它们被生成到页面上时,它们被赋予一个数字,从0开始数起来。因此,第一种成分的数字为0,第二种成分的数字为1等。他们有一个onclick,它将我发送给持有该数字的jQuery。我已经测试过,工作正常。

现在就是它出错的地方。我尝试了Javascript的$ .ajax(),jQuery的$ .post(),甚至使HTML元素直接与帖子形式。他们似乎都没有工作,即使我直接从其他地方复制示例。

我的PHP文件删除的项目如下:

PHP

<?php 
header('Location:index.php'); 
$xmldoc = new DOMDocument(); 
$xmldoc->load('ingredients.xml'); 

$root = $xmldoc->firstChild; //Take the <list> tag 

$toDel = $_POST['itemToDel']; // This is the number received of the relevant item 

$root->removeChild(item($toDel)); 

$xmldoc->save('ingredients.xml'); 
?> 

没有人对我有一个想法?当我用一个经过验证的工作PHP代码进行测试时,它并没有实现,所以我有感觉介于PHP和Javascript之间的行为,但它并没有实现。截至目前,因为我打消了我以前的尝试,这是我的JavaScript现在:

function removeItem(item){ 

var itemToDel = item; // The number of the item to delete. 
var removeItem = $('.ingredient')[itemToDel].remove(); // removing the HTML parts 

//Remove the matching XML line 
} 

最后一刻编辑:我可以在我的XML文件中写入(权限都OK了),我已经使用其他PHP脚本确实有效,所以localhost确实支持它。

回答

0

使用Xpath选择要删除的节点并将它们从各自的父节点中删除。 DOMXpath :: evaluate()允许您使用Xpath表达式来获取节点列表或标量值。在这种情况下,您需要一个包含一个或没有元素节点的列表。

选择文档元素 “名单” ...

/list

...里面的 “成分” 元素......

/list/ingredient

...减少到一个元素的位置......

/list/ingredient[3]

示例源:

$xml = <<<'XML' 
<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
    <ingredient>Third item</ingredient> 
    <ingredient>Fourth item</ingredient> 
</list> 
XML; 

$xmldoc = new DOMDocument(); 
$xmldoc->loadXml($xml); 
$xpath = new DOMXpath($xmldoc); 

$toDel = 3; 
$expression = '/list/ingredient['.((int)$toDel).']'; 

foreach ($xpath->evaluate($expression) as $node) { 
    $node->parentNode->removeChild($node); 
} 

echo $xmldoc->saveXml(); 

输出:

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 

    <ingredient>Fourth item</ingredient> 
</list> 
+0

谢谢你的回复THW,但是我想问一下多一点。在你的例子中,你将$ toDel表示为3,并且你知道这个数字是可变的。我的问题是从HTML页面获取这个数字到PHP中。我可以在我的HTML页面中定义它,并且我可以将其转换为JavaScript,但是转换到PHP似乎并不如此。 – Mortaza

+0

这个例子是自包含的,所以它可以在没有外部依赖(文件,用户输入)的情况下执行。你必须适应它并再次使用'$ toDel = $ _POST ['itemToDel'];'。 – ThW

+0

这回答了我的问题:)原来我做了一个成功的调用我的PHP文件,但与建议的PHP删除它,它实际上删除它。最后一个问题:你如何在foreach-bit中使用evaluate()?它通过使用'。((int)$ toDel)不正确吗?'或者我误解评估()? – Mortaza