我正在尝试将xml文件加载到mysql中 我的XML如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<TEST>
<DATABASE>
<CUSTOMERS>
<CUSTOMER l_name="aa" f_name="aaaa">
<adr>
<street txt="mainstreet" zipcode="11111"/>
</adr>
<adr>
<street txt="secondstreet" zipcode="11111"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="bb" f_name="bbbb">
<adr>
<street txt="teststreet" zipcode="22222"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="cc" f_name="cccc"/>
</CUSTOMERS>
</DATABASE>
</TEST>
我在mysql中导入文件的代码是:
LOAD XML LOCAL INFILE '/Applications/MAMP/htdocs/uebung/customer.xml'
INTO TABLE customer
ROWS IDENTIFIED BY '<CUSTOMER>';
所以它有效。但是,如果我有一个客户的两个地址,那么它只占用了数据库中的最后一个。也就是说,它只为客户加载l_name = aa
地址和第二条街道。主流的地址没有加载到DB中。
我如何更改我的MYSQL代码?
答案 0 :(得分:0)
使用CUSTOMER作为记录节点:ROWS IDENTIFIED BY '<CUSTOMER>'
,
每个<CUSTOMER>
标记内的每个属性标记必须是唯一的,因此如果您声明两次相同的节点(在本例中为<adr>
),则第二个节点的值将覆盖第一个节点&#39 ; s值。所以你基本上已经嵌套太多次了。
请改为尝试:
<TEST>
<DATABASE>
<CUSTOMERS>
<CUSTOMER l_name="aa" f_name="aaaa">
<adr>
<street txt="mainstreet" zipcode="11111"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="aa" f_name="aaaa">
<adr>
<street txt="secondstreet" zipcode="11111"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="bb" f_name="bbbb">
<adr>
<street txt="teststreet" zipcode="22222"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="cc" f_name="cccc"/>
</CUSTOMERS>
</DATABASE>
</TEST>
答案 1 :(得分:0)
考虑在PHP中运行XSLT以将原始XML转换为MySQL 你需要的格式。
XSLT (另存为.xsl文件,一个特殊的.xml文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- IdentityTransform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="CUSTOMER[*[name(*)!='addr']]">
<xsl:apply-templates select="*" />
</xsl:template>
<xsl:template match="adr">
<xsl:element name="CUSTOMER">
<xsl:copy-of select="ancestor::CUSTOMER/@l_name"/>
<xsl:copy-of select="ancestor::CUSTOMER/@f_name"/>
<xsl:copy>
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
PHP (使用php-xsl类)
// Set current path
$cd = dirname(__FILE__);
// Load the XML source and XSLT file
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load($cd.'/Source.xml');
$xsl = new DOMDocument;
$xsl->load($cd.'/XSLTScript.xsl');
// Transform the original xml
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
$newXml = $proc->transformToXML($xml);
// Save output to file
$xmlfile = $cd.'/Output.xml';
file_put_contents($xmlfile, $newXml);
输出 (在MySQL的LOAD DATA XML
命令中使用Output.xml)
<TEST>
<DATABASE>
<CUSTOMERS>
<CUSTOMER l_name="aa" f_name="aaaa">
<adr>
<street txt="mainstreet" zipcode="11111"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="aa" f_name="aaaa">
<adr>
<street txt="secondstreet" zipcode="11111"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="bb" f_name="bbbb">
<adr>
<street txt="teststreet" zipcode="22222"/>
</adr>
</CUSTOMER>
<CUSTOMER l_name="cc" f_name="cccc"/>
</CUSTOMERS>
</DATABASE>
</TEST>