使用PHP更新XML中的现有元素

时间:2011-12-14 23:00:58

标签: php xml

目前,我有这个用于将数据附加到我的项目文件:

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


    $item= $xmldoc->createElement('item');

    $item->setAttribute('id', '100');
    $item->setAttribute('category', 'Fitness');
    $item->setAttribute('name', 'Basketball');
    $item->setAttribute('url', 'http://google.com');
    $item->setAttribute('description', 'This is a description');
    $item->setAttribute('price', '899');


    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item);
    $xmldoc->save('ex.xml');

现在在添加之前,我想检查具有相同属性id值的现有元素“item”。

如果确实如此,它应该使用这些新数据更新该元素。

目前它只是附加并且不检查任何内容。

3 个答案:

答案 0 :(得分:2)

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

$xpath = new DOMXPath($xmldoc);
$query = $xpath->query('/mainXML/items/item[@id = "100"]');

$create_new_node = false;
if($query->length == 0)
{
    $item = $xmldoc->createElement('item');
    $create_new_node = true;
}
else
{
    $item = $query->item(0);
}

$item->setAttribute('id', '100');
$item->setAttribute('category', 'Fitness');
$item->setAttribute('name', 'Basketball');
$item->setAttribute('url', 'http://google.com');
$item->setAttribute('description', 'This is a description');
$item->setAttribute('price', '899');

if($create_new_node)
{
    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item);
}
$xmldoc->save('ex.xml');

答案 1 :(得分:1)

我没有使用过这个功能,但看起来很适合DOMDocument: Get Element By ID

如果您获得匹配的元素,请对其进行编辑,如果没有,请将其发布。

答案 2 :(得分:0)

如果你有这个xml文件的DTD,它指定“id”属性是ID类型(即它的值在文档中是唯一的并唯一标识其元素),那么你可以使用{{ 3}}

但是,您很可能没有DTD。在这种情况下,您应该只使用XPath:

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

$xpath = new DOMXPath($xmldoc);
$results = $xpath->query('//items/item[@id=100][0]');

if (!$results->length) {
    $item= $xmldoc->createElement('item');
    $item->setAttribute('id', '100');
    $item->setAttribute('category', 'Fitness');
    $item->setAttribute('name', 'Basketball');
    $item->setAttribute('url', 'http://google.com');
    $item->setAttribute('description', 'This is a description');
    $item->setAttribute('price', '899');

    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item);
    $xmldoc->save('ex.xml');
}

您还应考虑使用DOMDocument::getElementById()执行此任务。这个xml的结构和操作方式可能更适合SimpleXML。