2015-10-16 200 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

欢迎来到Stack Overflow。在不知道您使用的是哪种语言或XML API的情况下很难帮助您 - 而且您应该显示您已经尝试过的内容。另外,如果你可以展示一个简短的例子,这将有助于保持简单。 –

+0

将其转换为本地数组。正确构建它,然后将其转换回xml。提示:您可以使用json编码和解码来转换数组和从数组。 –

回答

0

考虑一种XSLT解决方案,其中大多数通用语言为包括Perl,PHP,Python,VB,Java和C#(还包括其他语言)维护库。作为信息,XSLT是专门用于转换,样式,重新格式化或重新构造XML文档的声明式专用编程语言(与SQL类型相同,但带有数据库)。

请注意:这个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>