Удаление узла xml с использованием php - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть XML-файл, подобный следующему:

<uploads>
 <upload>
  <name>asd</name>
  <type>123</name>
 </upload>
 <upload>
  <name>qwe</name>
  <type>456</name>
 </upload>
</uploads>

Теперь я хочу удалить загрузку узла с именем child как (скажем, qwe ).Как я могу удалить его с помощью php, чтобы полученное xml было

<uploads>
 <upload>
  <name>asd</name>
  <type>123</name>
 </upload>
</uploads>

У меня не слишком много знаний о xml и связанных с ним методах.Можно ли сделать это с помощью xpath, как это $xml->xpath('//upload//name')?Предполагая, что $xml был загружен с использованием функции simplexml_load_file().

Для справки, я использовал этот вопрос , чтобы сделать то, что я хочу.Но он выбирает элемент на основе атрибута, и я хочу выбрать элемент на основе значения его дочернего узла.

1 Ответ

2 голосов
/ 23 декабря 2011

Да, вы можете использовать XPath, чтобы найти узел, который нужно удалить.Вы можете использовать предикаты , чтобы указать точные элементы, которые вы ищете.В вашем случае предикат может быть has a name element and its (string/node) value is 'qwe', например:

<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->loadxml( getData() );

$xpath = new DOMXPath($doc);
foreach( $xpath->query("/uploads/upload[name='qwe']") as $node) {
    $node->parentNode->removeChild($node);
}
$doc->formatOutput = true;
echo $doc->savexml();


function getData() {
    return <<< eox
<uploads>
 <upload>
  <name>asd</name>
  <type>123</type>
 </upload>
 <upload>
  <name>qwe</name>
  <type>456</type>
 </upload>
</uploads>
eox;
}

print

<?xml version="1.0"?>
<uploads>
  <upload>
    <name>asd</name>
    <type>123</type>
  </upload>
</uploads>
...