2015-10-16 2 views
0

У меня возникла очень простая проблема, но я не знаю, как это сделать, поэтому было бы очень благодарно, если бы кто-нибудь мог предоставить быстрый ответ. В основном я имел XML ниже:Добавить родительский узел в дочерние узлы в XML

<Root> 
<Delhi> 
    <Population>1000</Population>`enter code here` 
</Delhi> 
<Mumbai> 
    <Population>1000</Population> 
    <District> 
     <Name>Colaba</Name> 
    </District> 
    <District> 
     <Name>navi Mumbai</Name> 
    </District> 
    <District></District> 
</Mumbai> 
<Mumbai> 
    <Population>1000</Population> 
</Mumbai> 
<Mumbai> 
    <Population>1000</Population> 
</Mumbai> 
<Chennai> 
    <Population>1000</Population> 
    <District> 
     <Name>Chan</Name> 
    </District> 
</Chennai> 
<Kolkata> 
    <Population>1000</Population> 
</Kolkata> 

Я хочу передать этот XML к способу и хочу ответ что-то вроде ниже:

<Root> 
<Delhi> 
    <Population>1000</Population> 
</Delhi> 
<Mumbai> 
    <Mumbai> 
     <Population>1000</Population> 
     <District> 
      <District> 
       <Name>Colaba</Name> 
      </District> 
      <District> 
       <Name>navi Mumbai</Name> 
      </District> 
      <District></District> 
     </District> 
    </Mumbai> 
    <Mumbai> 
     <Population>1000</Population> 
    </Mumbai> 
    <Mumbai> 
     <Population>1000</Population> 
    </Mumbai> 
</Mumbai> 
<Chennai> 
    <Chennai> 
     <Population>1000</Population> 
     <District> 
      <District> 
       <Name>Chan</Name> 
      </District> 
     </District> 
    </Chennai> 
</Chennai> 
<Kolkata> 
    <Population>1000</Population> 
</Kolkata> 

Поэтому логика очень просто: я хочу итерации через узлы Корневого элемента, и я проверяю, является ли мой узел Мумбаи, Районом или Ченнаи. Если это так, я заключу все теги под этим именем внутри тега с тем же именем. XML может иметь любой уровень, поэтому я считаю, что это необходимо сделать с помощью рекурсии.

+0

Какой язык вы пытаетесь сделать это? – AutomatedOrder

+1

Добро пожаловать в переполнение стека. Очень сложно помочь вам, не зная, какой язык или XML-интерфейс вы используете, - и вы должны показать, что вы уже пробовали. Кроме того, если бы вы могли показать более короткий пример, это помогло бы сделать вещи простыми. –

+0

Преобразуйте его в собственный массив. Стройте его правильно, а затем преобразуйте обратно в xml. Совет. Вы можете использовать json encode и декодировать для преобразования в и из массива. –

ответ

0

Рассмотрите решение XSLT, в котором большинство языков общего назначения поддерживают библиотеки для включения Perl, PHP, Python, VB, Java и C# (среди других). В качестве информации XSLT является декларативным языком программирования специального назначения (такого же типа, как SQL, но с базами данных), используемым специально для преобразования, стилизации, переформатирования или переструктурирования XML-документов.

Обратите внимание: этот скрипт XSLT преобразует ваш XML, но не обрабатывает только копии двух посторонних узлов Мумбаи, которые выглядят неуместными с вашим документом.

XSLT использует Muenchian Method для группировки элементов района.

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="MumbaiDistrict" match="Mumbai[1]" use="District" /> 
    <xsl:key name="ChennaiDistrict" match="Chennai" use="District" /> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Mumbai[1]"> 
     <xsl:element name="Mumbai"> 
     <xsl:element name="Mumbai">   
      <xsl:copy-of select="Population"/> 
      <xsl:element name="District"> 
       <xsl:for-each select="key('MumbaiDistrict', District)">   
       <xsl:copy-of select="District"/>   
      </xsl:for-each> 
      </xsl:element>   
     </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Chennai"> 
     <xsl:element name="Chennai"> 
     <xsl:element name="Chennai"> 
      <xsl:copy-of select="Population"/> 
      <xsl:element name="District"> 
      <xsl:for-each select="key('ChennaiDistrict', District)">   
       <xsl:copy-of select="District"/>   
      </xsl:for-each> 
      </xsl:element> 
     </xsl:element> 
     </xsl:element>   
    </xsl:template> 

</xsl:stylesheet> 

Выход

<?xml version="1.0"?> 
<Root> 
    <Delhi><Population>1000</Population>`enter code here` 
</Delhi> 
    <Mumbai> 
    <Mumbai> 
     <Population>1000</Population> 
     <District> 
     <District> 
      <Name>Colaba</Name> 
     </District> 
     <District> 
      <Name>navi Mumbai</Name> 
     </District> 
     <District/> 
     </District> 
    </Mumbai> 
    </Mumbai> 
    <Mumbai> 
    <Population>1000</Population> 
    </Mumbai> 
    <Mumbai> 
    <Population>1000</Population> 
    </Mumbai> 
    <Chennai> 
    <Chennai> 
     <Population>1000</Population> 
     <District> 
     <District> 
      <Name>Chan</Name> 
     </District> 
     </District> 
    </Chennai> 
    </Chennai> 
    <Kolkata> 
    <Population>1000</Population> 
    </Kolkata> 
</Root> 
Смежные вопросы