2010-10-14 6 views
0

У меня есть файл XMLУдаление узла из XML-файла

<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 
    <name>test</name> 
    <name>1</name> 
</category> 

Как я могу удалить узел <name>test</name> с помощью XPath, XQuery и PHP. Я использовал этот код

$name='test; 
    $xmlfile="config/shop_categories.xml"; 
    $xml = simplexml_load_file($xmlfile); 
    $target = $xml->xpath('/category[name="'.trim($name).'"]'); 
    print_r($target[0]); 
    if($target == false) 
    return; 
    $domRef = dom_import_simplexml($target[0]); //Select position 0 in XPath array 
    $domRef->parentNode->removeChild($domRef); 
    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->loadXML($xml->asXML()); 
    $dom->save($xmlfile); 

Но он не работает.

+1

Основная проблема заключается в том, что ваш XPath запрос возвращает 'category' узел, а не' name', как вы хотели. Ответ Гордона не упоминает об этом (на момент написания статьи), но исправляет проблему. – salathe

+0

@ salathe right, на самом деле я не обращал внимания на эту деталь, потому что этот симплекс для dom mishmash не имел для меня никакого смысла. – Gordon

+1

@Gordon, не беспокойтесь. Теперь OP имеет ответ * и * исправление. :) – salathe

ответ

1

Довольно уверен, что это дубликат, но слишком ленив, чтобы его найти. Здесь вы идете:

$xml = <<< XML 
<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 
    <name>test</name> 
    <name>1</name> 
</category> 
XML; 

$dom = new DOMDocument; 
$dom->loadXML($xml); 
$xPath = new DOMXPath($dom); 
foreach($xPath->query('//name[text() = "test"]') as $node) { 
    $node->parentNode->removeChild($node); 
} 
echo $dom->saveXML(); 

Выход:

<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 

    <name>1</name> 
</category> 
Смежные вопросы