PHP - Удалите элемент XML

Посмотрите, нет никакого простого способа сделать это. Я работаю над проектом, который является по сути многопоточным. События входят от операционной системы, и я должен обработать их одновременно.

самый простой способ иметь дело с испытательным комплексом, многопоточный код приложения - это: Если его слишком сложное для тестирования Вы делаете его неправильно. Если у Вас есть единственный экземпляр, который имеет несколько потоков, реагирующих на него, и Вы не можете протестировать ситуации, куда эти потоки ступают друг на всем протяжении друга, то Ваш дизайн должен быть восстановлен. Его и столь же простой и настолько сложный.

существует много способов программировать для многопоточности, которая избегает потоков, пробегающих экземпляры одновременно. Самое простое должно сделать все Ваши объекты неизменными. Конечно, это не обычно возможно. Таким образом, необходимо определить те места в дизайне, где потоки взаимодействуют с тем же экземпляром и сокращают количество тех мест. Путем выполнения этого Вы изолируете несколько классов, где многопоточность на самом деле происходит, уменьшая полную сложность тестирования Вашей системы.

, Но необходимо понять, что даже путем выполнения этого Вы все еще не можете протестировать каждую ситуацию, куда два потока ступают друг на друга. Чтобы сделать это, необходимо было бы выполнить два потока одновременно в том же тесте, затем управлять точно, какие строки они выполняют в любой данный момент. Лучшее, которое можно сделать, моделируют эту ситуацию. Но это могло бы потребовать, чтобы Вы кодировали специально для тестирования, и это - в лучшем случае половина шага к истинному решению.

, Вероятно, лучший способ к тестовому коду для поточной обработки проблем посредством статического анализа кода. Если Ваш потоковый код не следует за конечным множеством ориентированных на многопотоковое исполнение шаблонов, то у Вас могла бы быть проблема. Я полагаю, что Анализ кода в VS действительно содержит некоторое знание поточной обработки, но вероятно не очень.

Взгляд, при существующем положении вещей в настоящее время (и вероятно выдержит в течение хорошего времени прибыть), лучший способ протестировать многопоточные приложения состоит в том, чтобы уменьшить сложность потокового кода как можно больше. Минимизируйте области, где потоки взаимодействуют, тест максимально лучше всего, и используют анализ кода для идентификации опасных зон.

7
задан Ben Shelock 20 July 2009 в 13:49
поделиться

4 ответа

Вы можете использовать классы DOM в PHP. ( http://us3.php.net/manual/en/intro.dom.php ).

Вам нужно будет прочитать XML-документ в памяти, использовать классы DOM для манипуляций, а затем вы можете сохранить XML по мере необходимости (в http или в файл).

DOMNode - это объект, который имеет функции удаления (для ответа на ваш вопрос).

Это немного сложнее, чем SimpleXML, но один раз вы привыкнете к нему, он намного мощнее

(частично взят из примера кода на php.net)

<?php

$doc = new DOMDocument; 
$doc->load('theFile.xml');

$thedocument = $doc->documentElement;

//this gives you a list of the messages
$list = $thedocument->getElementsByTagName('message');

//figure out which ones you want -- assign it to a variable (ie: $nodeToRemove )
$nodeToRemove = null;
foreach ($list as $domElement){
  $attrValue = $domElement->getAttribute('time');
  if ($attrValue == 'VALUEYOUCAREABOUT') {
    $nodeToRemove = $domElement; //will only remember last one- but this is just an example :)
  }
}

//Now remove it.
if ($nodeToRemove != null)
$thedocument->removeChild($nodeToRemove);

echo $doc->saveXML(); 
?>

Это должно дать вам некоторое представление о том, как удалить элемент. Он распечатает XML без этого узла. Если вы хотите отправить его в файл, просто запишите строку в файл.

9
ответ дан 6 December 2019 в 07:52
поделиться

Дейв Морган прав в том, что классы DOM более мощные, но если вы хотите придерживаться SimpleXML, попробуйте использовать функцию unset () на любом узле. Например, unset ($ simpleXMLDoc-> node1-> child1), и он будет удален из XML.

10
ответ дан 6 December 2019 в 07:52
поделиться

Несмотря на то, что SimpleXML не имеет подробного способа удаления элементов, вы можете удалить элементы из SimpleXML с помощью PHP unset () . Ключом к этому является достижение желаемого элемента. По крайней мере, один из способов сделать таргетинг - использовать порядок элементов. Сначала узнайте порядковый номер элемента, который вы хотите удалить (например, с помощью цикла), затем удалите элемент:

$target = false;
$i = 0;
foreach ($xml->message as $m) {
  if ($m['time']=='1248083838') { $target = $i; break; }
  $i++;
}
if ($target !== false) {
  unset($xml->message[$target]);
}

Вы даже можете удалить несколько элементов с помощью этого, сохранив порядковый номер целевых элементов в массиве. Просто не забудьте выполнить удаление в обратном порядке ( array_reverse ($ target) ), потому что удаление элемента естественным образом уменьшает порядковый номер элементов, следующих за ним.

По общему признанию, это немного обходной путь, но вроде работает нормально.

2
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: