PHP4读取XML,并导入MySQL总结

来源:互联网 发布:个性手机qq主题软件 编辑:程序博客网 时间:2024/05/20 17:42
一:
项目目的,通过php4将Excel数据导出到MySQL中。
解决方法:
1、Excel另存为CSV格式。然后将CSV格式直接导入MySQL中(可以通过PHPMyAdmin导入CSV,改分隔符为“,”)。但是如果Excel文件中含多工作表(多个Sheet中都含数据)那么用CSV是不太方便的。因为Excel直接稻城CSV时是不支持多工作表的,只能将每个工作表的数据复制到新建的Excel文件中然后分别导出。

2、Excel另存为XML格式。XML文件天生就是干异构系统数据迁移用的。同时Excel导出XML文件时支持多工作表。
所以决定用XML文件格式导入。

注:(XML从Excel中导出后是UTF-8格式,PHP操作XML时默认编码是ISO-8859-1,而本人的php程序是GB2312编码,所以在操作时注意文件格式的声明和转换。)

二:
PHP4操作XML的步骤

    (1)创建XML编辑器
     $parser  =  xml_parser_create("Encode"); //参数可填写xml文件的编码格式,该参数可选;
    (2)设置处理开始标记和结束标记的方法,方法名称以字符串形式提供
      xml_set_element_handler($parser, "startElement", "endElement");
                          //指定遇到XML中的任意开始标记是运行 function startElement,
                         遇到任意结束标记(</)时运行function endElement; $parser 代表XML编辑器;和image函数类似
     (3)设置遇到数据(开始标记和结束标记之间的值)时的处理方式
      xml_set_character_data_handler($parser, "characterData"); //设立数据读取时调用function characterData

     设置完处理函数後就要打开XML文件,然后用 xml_parse 解析XML文件。xml_parse的调用需要在设置完以上三步后才能调用,否则报错

     (4) fopen 打开xml 然后 fread 读xml文件

     $filehandler = fopen(“xml文件路径”, "r");  //打开文件

    while ($data = fread($filehandler, filesize($xml_file)))
        //读xml文件,读取内容长度为
filesize($xml_file)个字节 --xml文件长度
   {
    xml_parse($parser, $data, feof($filehandler));  //(5) 解析获得的data数据,该过程将会调用上面设置的相应处理方式
   }
  
三、以上是操作步骤,接下来贴出实际样例
                   
<?php
error_reporting(E_ALL | E_WARNING);
ini_set('display_errors',1);

$parser = xml_parser_create("UTF-8"); //创建一个parser编辑器
xml_set_element_handler($parser, "startElement", "endElement");//设立标签触发时的相应函数 这里分别为startElement和endElenment
xml_set_character_data_handler($parser, "characterData");//设立数据读取时的相应函数

$xml_file="try.xml";//指定所要读取的xml文件,可以是url
$filehandler = fopen($xml_file, "r");//打开文件

while ($data = fread($filehandler, filesize($xml_file)))
{
    
xml_parse($parser,$data, feof($filehandler));
}
 
fclose($filehandler);
$fla =& xml_parser_free($parser);//关闭和释放parser解析器
if ($fla){
   
print_r($re);
}
else {
   
echo "XML解析器关闭失败!";
}
$name=false;
$position=false;

function startElement($parser_instance, $element_name, $attrs)        //起始标签事件的函数,只读取开始标记
{
    
    
global $Data,$att;
    
if($element_name=="DATA")
    {
        
$Data = true;
        
switch ($attrs["SS:TYPE"]){
            
case "Number":
                
$att = "listed_SC";
                
break;
            
case "String":
                
$att = "operationType";
                
break;    
        }
        
    }
else {
        
$Data = false;
    }
}

function characterData($parser_instance, $xml_data)                  //读取数据时的函数
{   global $Data,$att;
    
if($Data){
        
$a=iconv("UTF-8","GB2312",$xml_data);
        getData(
$att,$a);
    }
//End if
    $Data = false;
}

function endElement($parser_instance, $element_name)                 //结束标签事件的函数
{
 
}
function getData($att,$va){
    
global $re;
    
$re[$att][] = $va;
}
?> 
      
读取的xml文件try.xml为(该文件是Excel导出的)
<?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>CFXY-ZJ</Author>
  
<LastAuthor>CFXY-ZJ</LastAuthor>
  
<Created>2007-11-29T02:47:50Z</Created>
  
<LastSaved>2007-11-29T02:48:23Z</LastSaved>
  
<Company>CFXY</Company>
  
<Version>11.5606</Version>
 
</DocumentProperties>
 
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  
<WindowHeight>8895</WindowHeight>
  
<WindowWidth>13875</WindowWidth>
  
<WindowTopX>120</WindowTopX>
  
<WindowTopY>30</WindowTopY>
  
<ProtectStructure>False</ProtectStructure>
  
<ProtectWindows>False</ProtectWindows>
 
</ExcelWorkbook>
 
<Styles>
  
<Style ss:ID="Default" ss:Name="Normal">
   
<Alignment ss:Vertical="Center"/>
   
<Borders/>
   
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
   
<Interior/>
   
<NumberFormat/>
   
<Protection/>
  
</Style>
 
</Styles>
 
<Worksheet ss:Name="Sheet1">
  
<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1"
   x:FullRows
="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
   
<Row>
    
<Cell><Data ss:Type="Number">60001</Data></Cell>
    
<Cell><Data ss:Type="String">A</Data></Cell>
   
</Row>
   
<Row>
    
<Cell><Data ss:Type="Number">60002</Data></Cell>
    
<Cell><Data ss:Type="String">B</Data></Cell>
   
</Row>
   
<Row>
    
<Cell><Data ss:Type="Number">60004</Data></Cell>
    
<Cell><Data ss:Type="String">G</Data></Cell>
   
</Row>
  
</Table>
  
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   
<Selected/>
   
<Panes>
    
<Pane>
     
<Number>3</Number>
     
<ActiveRow>2</ActiveRow>
     
<ActiveCol>1</ActiveCol>
    
</Pane>
   
</Panes>
   
<ProtectObjects>False</ProtectObjects>
   
<ProtectScenarios>False</ProtectScenarios>
  
</WorksheetOptions>
 
</Worksheet>
 
<Worksheet ss:Name="Sheet2">
  
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows
="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
  
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   
<ProtectObjects>False</ProtectObjects>
   
<ProtectScenarios>False</ProtectScenarios>
  
</WorksheetOptions>
 
</Worksheet>
 
<Worksheet ss:Name="Sheet3">
  
<Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows
="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
  
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   
<ProtectObjects>False</ProtectObjects>
   
<ProtectScenarios>False</ProtectScenarios>
  
</WorksheetOptions>
 
</Worksheet>
</Workbook>

输出结果为:
Array ( [listed_SC] => Array ( [0] => 60001 [1] => 60002 [2] => 60004 ) [operationType] => Array ( [0] => A [1] => B [2] => G ) )
原创粉丝点击