我试图将此XML文件中的数据(由管理员导出给我)导入到我的phpMyAdmin MySQL数据库表中,以便进行本地开发。除了我不知道该怎么做。
我查看了LOAD XML INFILE
查询,将XML加载到我在本地数据库中构建的一个表中。但是,当我尝试通过查询
LOAD XML INFILE 'D://Secondary/wamp64/tmp/Part_Info.xml'
INTO TABLE dbtest.part_no
ROWS IDENTIFIED BY '<Row>'
OR
LOAD XML INFILE 'D://Secondary/wamp64/tmp/Part_Info.xml'
INTO TABLE dbtest.part_no
ROWS IDENTIFIED BY '<Data>'
表到处都填充了NULL值。
我假设这些数据不符合LOAD XML INFILE
要求的格式。 (如this question here所述)。
如何将此数据导入MySQL数据库表?
这里是需要导入的数据。
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>ANKUR PRAKASH</Author>
<LastAuthor>Shubham Mehta</LastAuthor>
<Created>2016-06-10T10:48:33Z</Created>
<LastSaved>2016-06-10T16:23:58Z</LastSaved>
<Version>16.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>4455</WindowHeight>
<WindowWidth>15345</WindowWidth>
<WindowTopX>0</WindowTopX>
<WindowTopY>0</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s62">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat ss:Format="0"/>
<Protection/>
</Style>
<Style ss:ID="s63">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat ss:Format="@"/>
<Protection/>
</Style>
<Style ss:ID="s64">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Arial" ss:Bold="1"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s65">
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"
ss:Bold="1"/>
</Style>
</Styles>
<Worksheet ss:Name="mltvwallinfotbl">
<Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="2001" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<Column ss:StyleID="s62" ss:AutoFitWidth="0"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="92.25"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="102"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="52.5"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="180.75"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="84.75"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="35.25"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="143.25"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="67.5"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="72"/>
<Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="90.75"/>
<Column ss:AutoFitWidth="0" ss:Width="81.75"/>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s64"><Data ss:Type="String">#</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Part #</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Mfr. Part #</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Mfr. #</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Part Description</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Prime Part #</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">PMA</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Key Word</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Part Type</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Planning Type</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">Reference Status</Data></Cell>
<Cell ss:StyleID="s65"><Data ss:Type="String">Inventory Status</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">1</Data></Cell>
<Cell><Data ss:Type="String">444-00522-700</Data></Cell>
<Cell><Data ss:Type="String">444-00522-700</Data></Cell>
<Cell><Data ss:Type="String">50010000</Data></Cell>
<Cell><Data ss:Type="String">INDICATOR,OXYG. HIGH PRESSURE</Data></Cell>
<Cell><Data ss:Type="String">444-00522-700</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Component</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">0</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">2</Data></Cell>
<Cell><Data ss:Type="String">444-01095-000</Data></Cell>
<Cell><Data ss:Type="String">444-01095-000</Data></Cell>
<Cell><Data ss:Type="String">50011658</Data></Cell>
<Cell><Data ss:Type="String">BELLOWS</Data></Cell>
<Cell><Data ss:Type="String">444-01095-000</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">Reorder Level</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">0</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">3</Data></Cell>
<Cell><Data ss:Type="String">444-01096-000</Data></Cell>
<Cell><Data ss:Type="String">444-01096-000</Data></Cell>
<Cell><Data ss:Type="String">50011658</Data></Cell>
<Cell><Data ss:Type="String">UNION</Data></Cell>
<Cell><Data ss:Type="String">444-01096-000</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">Reorder Level</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">87</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">4</Data></Cell>
<Cell><Data ss:Type="String">444-01298-400</Data></Cell>
<Cell><Data ss:Type="String">444-01298-400</Data></Cell>
<Cell><Data ss:Type="String">50010000</Data></Cell>
<Cell><Data ss:Type="String">ELECTRONIC PR SENSOR MODULE</Data></Cell>
<Cell><Data ss:Type="String">444-01298-400</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Component</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">58</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">5</Data></Cell>
<Cell><Data ss:Type="String">444-01298-800</Data></Cell>
<Cell><Data ss:Type="String">444-01298-800</Data></Cell>
<Cell><Data ss:Type="String">50011658</Data></Cell>
<Cell><Data ss:Type="String">PR.SENSR</Data></Cell>
<Cell><Data ss:Type="String">444-01298-400</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Component</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">69</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">6</Data></Cell>
<Cell><Data ss:Type="String">444-01300-300</Data></Cell>
<Cell><Data ss:Type="String">444-01300-300</Data></Cell>
<Cell><Data ss:Type="String">50011658</Data></Cell>
<Cell><Data ss:Type="String">VALVE</Data></Cell>
<Cell><Data ss:Type="String">444-01300-300</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">22</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">7</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA078</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA078</Data></Cell>
<Cell><Data ss:Type="String">50010001</Data></Cell>
<Cell><Data ss:Type="String">CARPET</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA078</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">48</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">8</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA079</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA079</Data></Cell>
<Cell><Data ss:Type="String">50010001</Data></Cell>
<Cell><Data ss:Type="String">CARPET</Data></Cell>
<Cell><Data ss:Type="String">443W5809JA079</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">98</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">9</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7VG</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7VG</Data></Cell>
<Cell><Data ss:Type="String">50010001</Data></Cell>
<Cell><Data ss:Type="String">KICKSTRIP</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7VG</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">25</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="Number">10</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7WD</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7WD</Data></Cell>
<Cell><Data ss:Type="String">50010001</Data></Cell>
<Cell><Data ss:Type="String">KICKSTRIP</Data></Cell>
<Cell><Data ss:Type="String">443W7000-7WD</Data></Cell>
<Cell><Data ss:Type="String">No</Data></Cell>
<Cell ss:Index="9"><Data ss:Type="String">Expendable</Data></Cell>
<Cell><Data ss:Type="String">None</Data></Cell>
<Cell><Data ss:Type="String">Active</Data></Cell>
<Cell ss:Formula="=RANDBETWEEN(0,100)"><Data ss:Type="Number">2</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Unsynced/>
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>9</PaperSizeIndex>
<HorizontalResolution>600</HorizontalResolution>
<VerticalResolution>600</VerticalResolution>
</Print>
<Selected/>
<TopRowVisible>75</TopRowVisible>
<LeftColumnVisible>2</LeftColumnVisible>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>107</ActiveRow>
<ActiveCol>4</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<ss:DocumentProperties>
<ss:Author>Ramco Systems Ltd</ss:Author>
<ss:LastAuthor>Ramco Systems Ltd</ss:LastAuthor>
<ss:Created>Friday, June 10, 2016</ss:Created>
</ss:DocumentProperties>
</Workbook>
注意:我没有寻找专门适合这些数据的数据库表。我只想将此.XML文件中的数据存储到本地SQL数据库表中。您可以自由地为适合您的答案假设任何表结构并解决问题。然而,为了表明我自己努力解决它,这里是我使用的表结构:
DROP TABLE IF EXISTS `part_no`;
CREATE TABLE IF NOT EXISTS `part_no` (
`#` varchar(5) NOT NULL,
`Part #` varchar(50) DEFAULT NULL,
`Mfr. Part #` varchar(50) DEFAULT NULL,
`Mfr. #` varchar(50) DEFAULT NULL,
`Part Description` varchar(50) DEFAULT NULL,
`Prime Part #` varchar(50) DEFAULT NULL,
`PMA` varchar(50) DEFAULT NULL,
`Key Word` varchar(50) DEFAULT NULL,
`Part Type` varchar(50) DEFAULT NULL,
`Planning Type` varchar(50) DEFAULT NULL,
`Reference Status` varchar(50) DEFAULT NULL,
`Inventory Status` varchar(4) DEFAULT NULL,
PRIMARY KEY (`#`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
答案 0 :(得分:2)
考虑运行XSLT将原始XML转换为MySQL要求的LOAD XML INFILE
格式。您的原始格式有相当多的命名空间和其他嵌套元素,我干扰MySQL上传。与大多数通用语言一样,PHP配备了XSLT 1.0处理器。
一个重要的项目是重命名数据库字段名称,特别是删除空格,#和句点以正确拟合xml标记名称(甚至遵循RDBMS中的最佳设计实践)。
XSLT 脚本(另存为下面引用的.xsl文件)
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:s="urn:schemas-microsoft-com:office:spreadsheet"
exclude-result-prefixes="s">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="s:Workbook">
<data>
<xsl:apply-templates select="s:Worksheet/s:Table/s:Row[position() > 1]"/>
</data>
</xsl:template>
<xsl:template match="s:Worksheet/s:Table/s:Row[position() > 1]">
<row>
<No><xsl:value-of select="s:Cell[1]/s:Data"/></No>
<PartNo><xsl:value-of select="s:Cell[2]/s:Data"/></PartNo>
<MfrPartNo><xsl:value-of select="s:Cell[3]/s:Data"/></MfrPartNo>
<MfrNo><xsl:value-of select="s:Cell[4]/s:Data"/></MfrNo>
<PartDescription><xsl:value-of select="s:Cell[5]/s:Data"/></PartDescription>
<PrimePart><xsl:value-of select="s:Cell[6]/s:Data"/></PrimePart>
<PMA><xsl:value-of select="s:Cell[7]/s:Data"/></PMA>
<KeyWord><xsl:value-of select="s:Cell[8]/s:Data"/></KeyWord>
<PartType><xsl:value-of select="s:Cell[9]/s:Data"/></PartType>
<PlanningType><xsl:value-of select="s:Cell[10]/s:Data"/></PlanningType>
<ReferenceStatus><xsl:value-of select="s:Cell[11]/s:Data"/></ReferenceStatus>
<InventoryStatus><xsl:value-of select="s:Cell[12]/s:Data"/></InventoryStatus>
</row>
</xsl:template>
</xsl:transform>
PHP 脚本
// LOAD XML AND XSL FILES
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');
$xslfile = new DOMDocument('1.0', 'UTF-8');
$xslfile->load('XSLTScript.xsl');
// TRANSFORM XML with XSLT
$proc = new XSLTProcessor;
$proc->importStyleSheet($xslfile);
$newXml = $proc->transformToXML($xml);
// OUTPUT TO FILE
file_put_contents('Output.xml', $newXml);
XML输出 (使用此输出文件加载到MySQL中,再次相应地重命名列)
<?xml version="1.0" encoding="UTF-8"?>
<data>
<row>
<No>1</No>
<PartNo>444-00522-700</PartNo>
<MfrPartNo>444-00522-700</MfrPartNo>
<MfrNo>50010000</MfrNo>
<PartDescription>INDICATOR,OXYG. HIGH PRESSURE</PartDescription>
<PrimePart>444-00522-700</PrimePart>
<PMA>No</PMA>
<KeyWord>Component</KeyWord>
<PartType>None</PartType>
<PlanningType>Active</PlanningType>
<ReferenceStatus>0</ReferenceStatus>
<InventoryStatus/>
</row>
<row>
<No>2</No>
<PartNo>444-01095-000</PartNo>
<MfrPartNo>444-01095-000</MfrPartNo>
<MfrNo>50011658</MfrNo>
<PartDescription>BELLOWS</PartDescription>
<PrimePart>444-01095-000</PrimePart>
<PMA>No</PMA>
<KeyWord>Expendable</KeyWord>
<PartType>Reorder Level</PartType>
<PlanningType>Active</PlanningType>
<ReferenceStatus>0</ReferenceStatus>
<InventoryStatus/>
</row>
<row>
<No>3</No>
<PartNo>444-01096-000</PartNo>
<MfrPartNo>444-01096-000</MfrPartNo>
<MfrNo>50011658</MfrNo>
<PartDescription>UNION</PartDescription>
<PrimePart>444-01096-000</PrimePart>
<PMA>No</PMA>
<KeyWord>Expendable</KeyWord>
<PartType>Reorder Level</PartType>
<PlanningType>Active</PlanningType>
<ReferenceStatus>87</ReferenceStatus>
<InventoryStatus/>
</row>
...
</data>
答案 1 :(得分:0)
我认为,除了试图导入Excel的XML数据格式之外,你只会感到悲伤。它实际上只用于在Excel中显示。除非有人在导出之前将列映射到XML字段,否则你不会为MySQL获得有用的文件。
最简单的解决方案是自己在Excel中打开文件并执行SAVE AS到CSV格式。
从那里LOAD DATA INFILE
命令功能强大且易于使用 - 特别是对于构造良好的CSV文件。