我正在尝试将MariaDB数据库中的数据转换为在无法访问数据库服务器的计算机上运行的第三方程序,因此我需要使用平面文本文件。
CSV不是一个选项,因为读取数据的程序在转义和引用方面效果不佳。
所以我现在一直坚持使用XML。幸运的是,MySQL或MariaDB允许在--xml
和mysql
命令行工具中使用mysqldump
参数。
但是,所有列的名称都为'field',属性名称为= “column_name”:
shell> mysql --xml -uroot -e "SHOW VARIABLES LIKE 'version%'"
<?xml version="1.0"?>
<resultset statement="SHOW VARIABLES LIKE 'version%'" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="Variable_name">version</field>
<field name="Value">5.0.40-debug</field>
</row>
<row>
<field name="Variable_name">version_comment</field>
<field name="Value">Source distribution</field>
</row>
对于阅读此数据以便能够理解的程序,我需要它采用以下格式:
<row>
<Variable_name>version</Variable_name>
<Value>5.0.40-debug</Value>
</row>
<row>
<Variable_name>version_comment</Variable_name>
<Value>Source distribution</Value>
</row>
我编写了一个小的XSLT样式表来转换它:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@name]">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
哪个有效,但对于使用命令行中的Xalan C ++的大型数据集(100k记录,2M行XML)来说非常慢。这可能需要15-30分钟。
有没有更好的方法来实现这一目标?真的太糟糕了,我们无法告诉MySQL / MariaDB使用普通标签名称输出XML而不是这些通用标签名称,并且必须在导出后进行翻译。
答案 0 :(得分:0)
我使用以下资源来处理MySQL的xml转储。 http://www.tutorialspoint.com/java_xml/java_dom_query_document.htm
我可以通过字段名称标记循环来获取名称/值对。