Как уже отмечал Марк, манипулировать XML проще всего с XSLT.И вам не нужно писать какие-либо циклы, обдумывание осуществляется процессором XSLT по вашему выбору.
Простые инструкции с XSLT
Вот как может выглядеть XSLT (для некоторых руководств Google предлагает «Идентификационное преобразование XSLT»).
Основы просты: этот тип XSLT-преобразования копирует все как есть, если только нет специального правила (сопоставление с шаблоном в XSLT), которое указывает исключение (в данном случае для <p>
элементов).Примечание: не имеет значения, насколько глубоко вложены ваши p-теги, что делает его идеальным для преобразования XML.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- identity transform -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- rename "p" with "new_p", copy everything inside p -->
<xsl:template match="p">
<new_p>
<xsl:apply-templates select="@* | node()"/>
</new_p>
</xsl:template>
</xsl:stylesheet>
Вызов XSLT из PHP
Это относительно просто, поскольку в PHP есть встроенный модуль для XSL.Вот как вы можете это сделать ( вот дополнительная информация ):
// create an XSLT processor and load the stylesheet as a DOM
$xproc = new XsltProcessor();
$xslt = new DomDocument;
$xslt->load('yourstylesheet.xslt'); // this contains the code from above
$xproc->importStylesheet($xslt);
// your DOM or the source XML (copied from your question)
$xml = '<p><a>1</a><b><c>1</c></b></p>';
$dom = new DomDocument;
$dom->loadXML($xml);
// do the transformation
if ($xml_output = $xproc->transformToXML($dom)) {
echo $xml_output;
} else {
trigger_error('Oops, XSLT transformation failed!', E_USER_ERROR);
}
Вывод соответствует ожидаемому (дополнительный отступ можно установить с помощью <xsl:output indent="yes"/>
:
<new_p>
<a>1</a>
<b><c>1</c></b>
</new_p>
Как видите: без циклов и итераций;)
PS: XSLT является широко распространенным и стабильным стандартом.Вам не нужно беспокоиться о правильном экранировании, разборе проблем с разделами или сущностями CDATA, потому что XSLT гарантирует, что вывод будет действительным XML.Это избавляет от головной боли, а не от руки.