【问题标题】:How to parse nested nodes in xml to csv in javajava - 如何将xml中的嵌套节点解析为java中的csv
【发布时间】:2015-11-17 19:43:47
【问题描述】:

我可能忽略了这里的解决方案,但我需要帮助将 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

提前致谢。

【问题讨论】:

  • 不要为 XSL 烦恼;通过使用 DOM 解析器(如 JDOM、XOM 或其他)和用于输出的专用 CSV 库(opencsv、supercsv 等),您将获得更多控制、更可维护的代码和更健壮的行为。
  • 谢谢 dnault。我能够找出我的 XSL 问题,但我也会看看你关于使用 DOM 解析器的建议。对我的 XSL 进行的更改是:

标签: java xml csv


【解决方案1】:

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

【讨论】:

  • 太好了,很高兴你能成功!您可能需要检查异常情况下的行为是否正确,例如包含逗号或双引号的名称(这是在生成和解析 CSV 时需要特殊处理的特殊字符)。
  • 知道了。对于可能的逗号,我将通过 '"' 来处理它在他们周围。如果有的话,我将不得不考虑处理双引号
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多