我正在努力尝试获取一个XML文档,该文档由专有数据库吐出并将其转换为格式良好的XML文档,最终将由Apache Solr编制索引。
我想把这个XML文件转换成Apache Solr格式,就像它下面那样。
<?xml version="1.0" encoding="UTF-8" ?>
<ecatalogue>
<tuple>
<table name="CatObjectName_tab">
<tuple>
<atom name="CatObjectName">Clog</atom>
</tuple>
</table>
<atom name="CatObjectNumber">2003-39-27A</atom>
<atom name="CatObjectTitle"></atom>
<table name="CatOtherNumbers_tab">
<tuple>
<atom name="CatOtherNumbers">1895.1.117a</atom>
</tuple>
</table>
<table name="ProPlaceName_tab">
<tuple>
<atom name="ProPlaceName">China</atom>
</tuple>
</table>
<table name="CatOtherNumberType_tab">
<tuple>
<atom name="CatOtherNumberType">Other Number</atom>
</tuple>
</table>
<atom name="DatDateMade"></atom>
<atom name="DatEarliestDateMadeOrig"></atom>
<atom name="DatLatestDateMadeOrig"></atom>
</tuple>
<tuple>
<table name="CatObjectName_tab">
<tuple>
<atom name="CatObjectName">Boot</atom>
</tuple>
</table>
<atom name="CatObjectNumber">2003-39-20B</atom>
<atom name="CatObjectTitle"></atom>
<table name="CatOtherNumbers_tab">
<tuple>
<atom name="CatOtherNumbers">1895.1.91b</atom>
</tuple>
</table>
<table name="ProPlaceName_tab">
<tuple>
<atom name="ProPlaceName">China</atom>
</tuple>
</table>
<table name="CatOtherNumberType_tab">
<tuple>
<atom name="CatOtherNumberType">Other Number</atom>
</tuple>
</table>
<atom name="DatDateMade"></atom>
<atom name="DatEarliestDateMadeOrig"></atom>
<atom name="DatLatestDateMadeOrig"></atom>
</tuple>
</ecatalogue>
我想将上述内容转换为:
<add>
<doc>
<field name="ProPlaceName">China</field>
<field name="CatObjectTitle"></field>
<field name="CatObjectNumber">2003-39-27A</field>
<field name="CatOtherNumberType">Other Number</field>
<field name="CatOtherNumbers">1895.1.117a</field>
<field name="CatObjectName_tab">Clog</field>
<field name="DatDateMade"></field>
<field name="DatEarliestDateMadeOrig"></field>
<field name="DatLatestDateMadeOrig"></field>
</doc>
<!-- Row 2 -->
<doc>
<field name="ProPlaceName">China</field>
<field name="CatObjectTitle"></field>
<field name="CatObjectNumber">2003-39-20B</field>
<field name="CatOtherNumberType">Other Number</field>
<field name="CatOtherNumbers">1895.1.91b</field>
<field name="CatObjectName_tab">Boot</field>
<field name="DatDateMade"></field>
<field name="DatEarliestDateMadeOrig"></field>
<field name="DatLatestDateMadeOrig"></field>
</doc>
</add>
最好尝试使用XSL / XSLT或使用java或其他编程语言来进行转换吗?你会如何解决这个问题?你能指出我正确的方向吗?
我相信可以使用XSL完成。任何帮助表示赞赏。
答案 0 :(得分:2)
这里应该有所帮助。它相当简单,并假设您正在跳过任何嵌套表...而只是抓取其中的原子。它不会按任何特定顺序对字段进行排序。
<xsl:template match="/">
<add>
<xsl:for-each select="ecatalogue/tuple">
<doc>
<xsl:for-each select=".//atom">
<field name="{@name}"><xsl:value-of select="."/></field>
</xsl:for-each>
</doc>
</xsl:for-each>
</add>
</xsl:template>
答案 1 :(得分:0)
除非你能保证XML始终有效,否则我会采用编程语言方法。我为您解析数据提供了更多的灵活性。您声明数据来自专有数据库,这使我想要灵活性。
例如,如果数据库由于缺陷导出无效的xml,该怎么办?你能早点改变什么组件?
为什么不选择解析XML的解决方案,然后创建一个可以输出到所需格式的对象模型。您可以使用自己的XML / XSLT或模板工具集(POJO / Velocity)来处理最终转换。