Здравствуйте, значит задача стоит вот в чем. Есть файл приблизительно такой структуры: <?xml version="1.0" encoding="iso-8859-1"?> <ICG version="2005042510"> <Category name="electronics"> <ItemType> <Category name="audio-video-accessories-and-parts"> <Term name="audio-video-accessories-and-parts"> <Term name="audio-crossovers-and-accessories"></Term> </Term> </Category> </ItemType> </Category> <Category name="house_and_garden"> <ItemType> ..... <ItemType> </Category> </ICG> Оговорюсь, что структура файла, после открытия категории (электроникс) заранее не известна, но она древовидная. Задача стоит вот в чем. Нужно сделать из одного XML файла несколько XML файлов, которые будут называться electronics.xml house_and_garden.xml и будут содержать в корне вот это <Category name="electronics"> , а все остальное - только то что к ним относится. Курю мануалы уже 3-й день. Не знаю как разбить, и все тут...
Если попроще, то можно так: Код (Text): $doc=new DomDocument(); $doc->load('ICG.xml'); for($i=0; $i<$doc->documentElement->childNodes; $i++) { $node=$doc->documentElement->childNodes->item($i); $doc_save = new Document(); $node_save=$doc_save->importNode($node, true); $doc_save->appendChild($node_save); $doc_save->save($node->getAttribute('name') . '.xml'); } Если в /ICG есть не только узлы Category, или надо сохранять и вложенные, то нужно использовать DomXpath: Код (Text): $doc=new DomDocument(); $doc->load('ICG.xml'); $xpath = new DomXpath($doc); $query = $xpath->query('//Category'); for($i=0; $i<$query.length; $i++) { $node=$query->item($i); $doc_save = new Document(); $node_save=$doc_save->importNode($node, true); $doc_save->appendChild($node_save); $doc_save->save($node->getAttribute('name') . '.xml'); }
ibnteo, спасибо, вы очень помогли. Получилось вторым способом, через XPath. Вот кусок работающего кода: PHP: $doc=new DOMDocument(); $doc->load('electronics.xml'); $xpath = new DomXpath($doc); $query = $xpath->query('/ICG/Category'); /*debug*/ echo "<hr> /cs_amazon/cs_office-5.11/channels/amazon/tests/test_xml.php <hr><pre>"; /*debug*/ print_r ($query->length); echo "</pre>"; for($i=0; $i < $query->length; $i++) { $node=$query->item($i); $doc_save = new DOMDocument(); $node_save=$doc_save->importNode($node, true); $doc_save->appendChild($node_save); $doc_save->save($node->getAttribute('name') . '_083.xml'); }