如何将这个XML数据导入MySQL数据库表?

时间:2016-06-11 11:48:22

标签: php mysql xml database

我试图将此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;

2 个答案:

答案 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() &gt; 1]"/>
    </data>
  </xsl:template>

  <xsl:template match="s:Worksheet/s:Table/s:Row[position() &gt; 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文件。