2012-05-24 91 views
1

我正在處理XML文件,我需要通過PHP讀取數據,然後將數據保存到數據庫中。到目前爲止,我成功了。問題是,它是專門爲下面的XML製作的。我需要的是一個通用的代碼,它可以對任何類型的XML代碼執行相同的操作。從XML捕獲數據並保存在數據庫中

這是我的XML和PHP代碼

<?xml version="1.0" encoding="ISO-8859-1"?> 

<list> 

<person> 

     <person_id>1</person_id> 
     <fname>Mikael</fname> 
     <lname>Ronstrom</lname> 
    </person> 
    <person> 
     <person_id>2</person_id> 
     <fname>Lars</fname> 
     <lname>Thalmann</lname> 
    </person> 
    <person> 
     <person_id>3</person_id> 
     <fname>Mikael</fname> 
     <lname>Ronstrom</lname> 
    </person> 
    <person> 
     <person_id>4</person_id> 
     <fname>Lars</fname> 
     <lname>Thalmann</lname> 
    </person> 
    <person> 
     <person_id>5</person_id> 
     <fname>Mikael</fname> 
     <lname>Ronstrom</lname> 
    </person> 
    <person> 
     <person_id>6</person_id> 
     <fname>Lars</fname> 
     <lname>Thalmann</lname> 

    </person> 
</list> 

這裏是我的PHP代碼

$con = mysql_connect("localhost","root","vertrigo"); 
if (!$con) 
{ 
die('Could not connect: ' . mysql_error()); 
} 

mysql_select_db("test", $con); 



$xml = simplexml_load_file("xml.xml"); 


$aa = ""; 
foreach($xml->children() as $child) 
{ 


foreach($child->children() as $childs) 
{ 
$aa .= "'".$childs ."',"; 


} 
$aa = substr_replace($aa, "", -1); 

$sql = "INSERT into tbl_xmldata (person_id,first_name,last_name) values ($aa)"; 
$aa = ""; 
$rr = mysql_query($sql); 

} 
if ($rr){ echo "data successfully captured from XML and inserted in db";}else{ echo "sorry no data insertion";} 
+0

有沒有人可以幫助我? – user1210460

+3

如果不進行某些高級編程,你所要求的聲音幾乎是不可能的。一個數據庫有一個預定義的結構 - 表,列,字段類型等,所以導入「任何」類型的XML意味着你將不得不建立一些高級函數,以便動態地建立數據庫結構,這樣您的PHP腳本可以正確地將數據插入到該數據庫中的正確位置。 – GDP

回答

3

更新:

在互聯網上搜索,我發現這個類,也許可以幫助你:

它是calle d MySQL把XML - XML到MySQL並插入MySQL中XML和出口的MySQL到XML

鏈接:http://www.phpclasses.org/package/782-PHP-Insert-XML-in-MySQL-and-export-MySQL-to-XML.html


第一個想法:

中有人的評論說:您的問題:

「數據庫具有預定義的結構 - 表,列,字段類型等,因此要導入」一個y「種類的XML意味着您將不得不建立一些高級功能,以便動態構建數據庫結構,以便您的PHP腳本可以正確地將數據插入到該數據庫中的正確位置。」

他是對的,這幾乎是不可能的。我的建議是使用一個類來解析XML。這個類將XML轉換爲$array,然後您可以獲得您想要的任何元素(我認爲您可以做的最好)。

下載PHP級 「潔淨XML到陣列」 在這裏:

http://dl.dropbox.com/u/15208254/stackoverflow/lib.xml.php

例子:

<?php 

header('Content-type: text/plain'); 

include('lib.xml.php'); 

$xml = new Xml; 


// PARSE 


// Parse from a source into a variable (default source type : FILE) 
$source = '<?xml version="1.0" encoding="utf-8"?> 

<test> 
    <this a="b"> 
    <is c="d"> 
     <a e="f" g="h"> first test</a> 
    </is> 
    <is> 
     <b hello="world">second test</b> 
    </is> 
    </this> 
</test>'; 
$out = $xml->parse($source, NULL); 
print_r($out); 

/* will output 
Array 
( 
    [this] => Array 
     ( 
      [is] => Array 
       ( 
        [0] => Array 
         ( 
          [a] => first test 
          [a-ATTR] => Array 
           ( 
            [e] => f 
            [g] => h 
           ) 
         ) 
        [1] => Array 
         ( 
          [b] => second test 
          [b-ATTR] => Array 
           ( 
            [hello] => world 
           ) 
         ) 
       ) 
      [is-ATTR] => Array 
       ( 
        [c] => d 
       ) 
     ) 
    [this-ATTR] => Array 
     ( 
      [a] => b 
     ) 
) 
*/ 


// Parse from a local file 
$out = $xml->parse('myfile.xml', 'FILE'); 
print_r($out); 

// Parse from a Web file 
$out = $xml->parse('http://site.tld/myfile.xml', 'CURL'); 
print_r($out); 



// ENCODING 

// You could specify an encoding type (default : utf-8) 
$out = $xml->parse('myfile.xml', 'FILE', 'ISO-8859-15'); 
print_r($out); 

// have fun ;-) 

?> 

如何插入值是多少?

做一個重複元素的for each,否則訪問其他元素只是這樣做:

<?php 
$array = array(
    "foo" => "bar", 
    42 => 24, 
    "multi" => array(
     "dimensional" => array(
      "array" => "foo" 
     ) 
    ) 
); 

/* Values are: 
* $array[42] --> outputs 24 
* $array['foo'] --> outputs bar 
* $array['multi']['dimensional']['array'] --> outputs foo 
*/ 
$sql = "INSERT INTO table (id, value1, value2) VALUES ($array[42], '$array['foo']', '$array['multi']['dimensional']['array']')"; 

?> 
+0

這樣一個很好的評論傢伙你的人搖滾感謝很多。你讓人清醒 – user1210460

2

我同意鄉親的程度。確實要做出這樣的事情是很困難的,但這不是不可能的。如果你收到的XML是標準的(相同數量的孩子等),並且xml非常簡單,就像你的例子那麼這是可能的。

此代碼基於類似的東西,我做了一陣子回來。適用於此文件。嘗試使用不同的XML並根據需要進行修改。(請記住,這是舊的代碼和醜陋的種類,如果你願意隨意修飾它)

// create the database connection 
$con = mysql_connect("127.0.0.1","root","lolzapassword") or die('Could not connect: ' . mysql_error()); 

$xml_obj = simplexml_load_file('xml.xml'); 

// init some stuff 
$sql = array(); 
$fields = array(); 

// initial name is the table name 
$table_name = $xml_obj->getName(); 

// Create db if one doesn't exist (this is up to you. i use test) 
mysql_query('CREATE DATABASE IF NOT EXISTS test'); 

foreach($xml_obj->children() as $child) 
{ 
    $row = array(); 
    foreach($child->children() as $child) 
    { 
    $field = $child->getName(); // grab the name before we convert to string 

    $child = trim((string)$child); // converts from SimpleXMLElement and removes extra whitespace 
    if($child == '') 
     $child = -1; // make -1 if empty 

    $row[$field] = "'".mysql_real_escape_string($child, $con)."'"; // save the value hooray! 

    // fill the field creation array for table creation 
    if(!isset($fields[$field])) $fields[$field] = $field.' text'; 
    } 

    $sql[] = "INSERT INTO test.{$table_name} (".join(',', array_keys($row)).") values (".join(',',array_values($row)).")"; // store the row! 
} 

// create the table if it doesn't exist already. Since we have no idea what 
// format stuff comes in I make them text. If you want to be more specific you can 
// check types as best you can and make some assumptions from that. 
mysql_query('CREATE TABLE IF NOT EXISTS test.'.$table_name.' ('. join(',', $fields). ')'); 

// now we insert. remember, this code assumes that the xml is standard and there's 
// no extra nodes or children than expected. 
//print_r($sql); // if u want to see the sql commands 
foreach($sql as $insert){ 
    $result = mysql_query($insert, $con); 
    if(!$result) 
    exit("ZOMG ERROR! ".mysql_error($con)); 
}