如何在xml中将xml中的嵌套节点解析为csv

时间:2015-11-17 19:43:48

标签: java xml csv

我可能会在这里忽略解决方案,但我需要帮助将xml转换为具有多个嵌套节点的csv。给出的xml如下所示:

<?xml version="1.0"?>
<familyResponse>
  <results>
    <childResults>
      <childName>Mary</childName>
      <childAge>8</childAge>
    </childResults>
    <childResults>
      <childName>Jason</childName>
      <childAge>10</childAge>
    </childResults>
    <childResults>
      <childName>Ashley</childName>
      <childAge>15</childAge>
    </childResults>
    <parentResults>
      <parentName>Theresa</parentName>
      <parentAge>35</parentAge>
    </parentResults>
  </results>
  <results>
    <parentResults>
      <parentName>Tom</parentName>
      <parentAge>21</parentAge>
    </parentResults>
  </results>
  <results>
    <childResults>
      <childName>Tori</childName>
      <childAge>2</childAge>
    </childResults>
    <parentResults>
      <parentName>Sheila</parentName>
      <parentAge>19</parentAge>
    </parentResults>
  </results>
</familyResponse>

总会有一个带有1个条目的parentResults。可能并不总是有childResults条目,也可能有多个childResults条目。如果没有childResults条目,我不需要将parentResults放在文件中,我希望我的csv文件如下所示:

parentName,parentAge,childName,childAge
Theresa,35,Mary,8
Theresa,35,Jason,10
Theresa,35,Ashley,15
Sheila,19,Tori,2

我已经将我的java代码放在一起并且可以解析xml但我需要帮助处理嵌套节点。

在我的xsl文件中,我尝试过这样做:

<xsl:template match="/">parentName,parentAge,childName,childAge
  <xsl:for-each select="//results>
    <xsl:value-of select="concat(parentResults/parentName,',',parentResults/parentAge,',',childResults/childName,',',childResults/childAge,'&#xA;')"/>
  </xsl:for-each>
</xsl:template>

但那给了我:

parentName,parentAge,childName,childAge
Theresa,35,Mary,8
Sheila,19,Tori,2

我也试过这个:

<xsl:template match="/">parentName,parentAge,childName,childAge
  <xsl:for-each select="//results>
    <xsl:for-each select="//childResults>
      <xsl:value-of select="concat(parentResults/parentName,',',parentResults/parentAge,',',childName,',',childAge,'&#xA;')"/>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

但那给了我:

parentName,parentAge,childName,childAge
,,Mary,8
,,Jason,10
,,Ashley,15
,,Tori,2

我也试过这个:

<xsl:template match="/">parentName,parentAge,childName,childAge
  <xsl:for-each select="//results>
    <xsl:for-each select="//parentResults>
      <xsl:value-of select="concat(parentName,',',parentAge)"/>
    </xsl:for-each>
    <xsl:for-each select="//childResults>
      <xsl:value-of select="concat(',',childName,',',childAge,'&#xA;')"/>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

但那给了我:

parentName,parentAge,childName,childAge
Theresa,35,Mary,8
,,Jason,10
,,Ashley,15
Sheila,19,Tori,2

提前致谢。

1 个答案:

答案 0 :(得分:0)

谢谢dnault。我能够用XSL弄清楚我的问题,但我也会看看你使用DOM解析器的建议。对我的XSL进行更改以使其起作用:

<xsl:template match="/">parentName,parentAge,childName,childAge
  <xsl:for-each select="//results>
    <xsl:for-each select="//childResults>
      <xsl:value-of select="concat(../parentResults/parentName,',',../parentResults/parentAge,',',childName,',',childAge,'&#xA;')"/>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>