Как удалить элемент из дерева XML, где атрибутом является конкретная строка в Simple XML PHP - PullRequest
1 голос
/ 07 сентября 2011

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

Например:

<xml>
  <note url="http://google.com">
   Values
  </note>
  <note url="http://yahoo.com">
   Yahoo Values
  </note>
</xml>

Так как бы удалить узел заметки с атрибутомhttp://yahoo.com как строка для URL?

Я пытаюсь сделать это в PHP Simple XML

О, а также я загружаю его как объект XML сфункция SimpleXML_Load_String выглядит так:

$notesXML = simplexml_load_string($noteString['Notes']);

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

SimpleXML не имеет функции удаления дочерних узлов,
есть случаи, которые вы можете сделать Как удалить элемент внутри строки XML?
, но это зависит от структуры XML

Раствор в DOMDocument

$doc = new DOMDocument;
$doc->loadXML($noteString['Notes']);

$xpath = new DOMXPath($doc);
$items = $xpath->query( 'note[@url!="http://yahoo.com"]');

for ($i = 0; $i < $items->length; $i++)
{
  $doc->documentElement->removeChild( $items->item($i) );
}
1 голос
/ 09 сентября 2011

Можно удалить узлы с помощью SimpleXML, используя unset(), хотя есть некоторые хитрости.

$yahooNotes = $notesXML->xpath('note[@url="http://yahoo.com"]');
// We know there is only one so access it directly
$noteToRemove = $yahooNotes[0];
// Unset the node. Note: unset($noteToRemove) would only unset the variable
unset($noteToRemove[0]);

Если есть несколько совпадающих узлов, которые вы хотите удалить, вы можете зациклить их.

foreach ($yahooNotes as $noteToRemove) {
    unset($noteToRemove[0]);
}
...