PHP domDocument для удаления дочерних узлов дочернего узла - PullRequest
2 голосов
/ 07 декабря 2011

Как удалить родительский узел дочернего узла, но сохранить все дочерние узлы?

Файл XML такой:

<?xml version='1.0'?>
<products>
<product>
<ItemId>531<ItemId>
<modelNumber>00000</modelNumber>
<categoryPath>
<category><name>Category A</name></category>
<category><name>Category B</name></category>
<category><name>Category C</name></category>
<category><name>Category D</name></category>
<category><name>Category E</name></category>
</categoryPath>
</product>
</products>

По сути, мне нужно удалить узел categoryPath и узел категории, но оставить все узлы имен внутри узла продукта. То, к чему я стремлюсь, это такой документ:

 <?xml version='1.0'?>
<products>
<product>
<ItemId>531<ItemId>
<modelNumber>00000</modelNumber>
<name>Category A</name>
<name>Category B</name>
 <name>Category C</name>
<name>Category D</name>
<name>Category E</name>
</product>
</products>

Есть ли встроенная функция PHP для этого? Любые указатели приветствуются, я просто не знаю, с чего начать, потому что есть много дочерних узлов.

Спасибо

1 Ответ

0 голосов
/ 07 декабря 2011

Хороший подход к обработке данных XML заключается в использовании DOM .

Это довольно просто, когда вы познакомитесь с ним.Например:

<?php

// load up your XML
$xml = new DOMDocument;
$xml->load('input.xml');

// Find all elements you want to replace. Since your data is really simple,
// you can do this without much ado. Otherwise you could read up on XPath.
// See http://www.php.net/manual/en/class.domxpath.php
$elements = $xml->getElementsByTagName('category');

// WARNING: $elements is a "live" list -- it's going to reflect the structure
// of the document even as we are modifying it! For this reason, it's
// important to write the loop in a way that makes it work correctly in the
// presence of such "live updates".
while($elements->length) {
    $category = $elements->item(0); 
    $name = $category->firstChild; // implied by the structure of your XML 

    // replace the category with just the name 
    $category->parentNode->replaceChild($name, $category); 
} 

// final result:
$result = $xml->saveXML();

См. Это в действии .

...