2013-04-17 2 views
-1

Можно ли удалить п число элементов XML из XML-документа, так чтоСращивание XML в PHP

<root> 
<example> 
<thing>1</thing> 
<somethingelse>1</somethingelse> 
</example> 
<example> 
<thing>2</thing> 
<somethingelse>2</somethingelse> 
</example> 
<example> 
<thing>3</thing> 
<somethingelse>3</somethingelse> 
</example> 
</root> 

может стать

<root> 
<example> 
<thing>3</thing> 
<somethingelse>3</somethingelse> 
</example> 
</root> 

например xml_splice ($ xml, 2,3)

После поиска документации я не могу найти простой способ сделать это в simpleXML, но есть что-то еще, что я могу использовать? или я застрял в написании своей собственной функции, используя $ xmlIterator-> next();

заранее спасибо

+1

запросов узлы, которые вы хотите удалить с помощью XPath. Затем удалите их. – Gordon

ответ

1

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

Вместо этого, вы можете просто удалить два раза первый элемент:

$xml = simplexml_load_string($string); 

for ($remove = 2; $remove--;) 
{ 
    unset($xml->example[0]); 
} 

Это даст вам:

<?xml version="1.0"?> 
<root> 


    <example> 
    <thing>3</thing> 
    <somethingelse>3</somethingelse> 
    </example> 
</root> 

Проблема с этим подходом является то, что вы не можете обобщать. Лучше сначала создать массив с элементами для удаления, затем перебрать этот массив и удалить один элемент за другим.

Простым способом создания такого массива с помощью simplexml является либо iterator_to_array(), либо метод SimpleXMLElement::xpath(). Как вы использовали xml_splice() как макет в вашем вопросе, я предполагаю, что вы хотите увидеть вариант массива первым:

$examples = $xml->example; 
$elements = iterator_to_array($examples, false); 
array_splice($elements, 2, 3); 

Это ставит весь примера элементов, которые должны быть удалить в $elements. Остается только удалить их. В SimpleXML это требует SimpleXmlElement-самореференции:

foreach($elements as $element) 
{ 
    unset($element[0]); 
} 

Как вы можете видеть, чтобы удалить $element узел из $xml документа, она снята с охраной по его первому смещению().Если вы хотите добавить var_dump сразу после нравится:

unset($element[0]); 
var_dump($element); 

Вы не увидите это предупреждение показывать вам элемент-узел был удален:

Предупреждение: var_dump(): Узел больше не существует

выход, как теперь можно было бы ожидать:

<?xml version="1.0"?> 
<root> 


    <example> 
    <thing>3</thing> 
    <somethingelse>3</somethingelse> 
    </example> 
</root> 

для варианта с XPath см, пожалуйста, мой ответ на связанный с этим вопрос:

Смежные вопросы