0

I had a very simple problem but am short on time so would be really grateful if anyone can provide the quick answer. Basically I had an XML given below :

 <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>

I want to pass this XML to a method and want a response something like below:

<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>

So the logic is very simple : I want to iterate through the nodes of the Root Element and I check if my node is either Mumbai,District or Chennai. If it is, I enclose all the tags by that name inside a tag having the same name. The XML can have any level so I believe it needs to be done through recursion effectively.

1 Answers1

0

Consider an XSLT solution which most general-purpose languages maintain libraries for including Perl, PHP, Python, VB, Java, and C# (among still others). As information, XSLT is declarative, special-purpose programming language (same type as SQL is but with databases) used specifically to transform, style, re-format, or re-structure XML documents.

Please note: this XSLT script transforms your XML but does not handle only copies the two extraneous Mumbai nodes which seem out of place with your document.

The XSLT uses the Muenchian Method to group the District items together.

<?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>

Output

<?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>
Parfait
  • 104,375
  • 17
  • 94
  • 125