Я не рекомендую регулярное выражение (или даже любой инструмент для работы со строками) для изменения XML.Вместо этого запустите ваш XML через эту небольшую таблицу стилей XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- this template copies your input XML unchanged... -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!-- ...except for anything with hun="true", where it adds a new element -->
<xsl:template match="*[@hun = 'true']">
<xsl:copy-of select="." />
<newxml value="number" />
</xsl:template>
</xsl:stylesheet>
Функция PHP, используемая для этой задачи: xslt_process()
( см. Документы ).
Комутолько добавьте <newxml value="number" />
там, где его нет, второй шаблон изменится на:
<xsl:template match="*[@hun = 'true'
and not(following-sibling::*[1][self::newxml])]
">
<xsl:copy-of select="." />
<newxml value="number" />
</xsl:template>