2012-05-16 105 views
-1

雖然我已經編程了幾年,但我對PHP還是比較新的。使用PHP將XML數據加載到Oracle

我正在開發一個項目,最終目標是在夜間基礎上將某個xml文件的某些元素加載到oracle表中。我有一個腳本每晚運行並將文件保存在本地機器上。我一直在尋找答案,但一直沒有成功。

這是一個xml文件的聚合示例。

<?xml version="1.0" encoding="UTF-8" ?> 
<Report account="7869" start_time="2012-02-23T00:00:00+00:00" end_time="2012-02-23T15:27:59+00:00" user="twilson" more_sessions="false"> 
<Session id="ID742247692" realTimeID="4306650378"> 
    <Visitor id="5390643113837"> 
    <ip>128.XXX.XX.XX</ip> 
    <agent>MSIE 8.0</agent> 
    </Visitor> 
</Session> 
<Session id="ID742247695" realTimeID="4306650379"> 
    <Visitor id="7110455516320"> 
    <ip>173.XX.XX.XXX</ip> 
    <agent>Chrome 17.0.963.56</agent> 
    </Visitor> 
</Session> 
</Report> 

有一點要注意的是,XML文件將包含幾個對象,我需要加載到我的表,上面的例子也只是針對兩行數據。我熟悉將數據連接和加載到oracle的全部過程,並設置了執行txt的ETL的類似腳本。和csv。使用php的文件。不幸的是,在這種情況下,我的數據存儲在XML中。加載csv時採取的方法。文件是將數據加載到一個數組中並從那裏繼續。

我非常確定,我可以使用類似的東西,也許爲每個或類似的東西創建變量,但我不太確定如何做到這一點與XML。文件。

$xml = simplexml_load_file('C:/Dev/report.xml'); 

echo $xml->Report->Session->Visitor->agent; 

在上面的代碼中,我試圖返回與每個訪問者關聯的代理。這將返回一個錯誤'嘗試獲取第11行的C:\ PHP \ chatTest.php中的非對象的屬性'

最終結果是我將數據加載到類似於我提供的示例將加載到我的表中的兩行看起來類似於下面但是我認爲我可以處理,如果我能夠獲得數據到數組或類似的東西。

IP|AGENT 
128.XXX.XX.XX MSIE 8.0 
173.XX.XX.XXX Chrome 17.0.963.56 

任何幫助將不勝感激。

修訂代碼:

$doc = new DOMDocument(); 
    $doc->load('C:/Dev/report.xml'); 

    $sessions = $doc->getElementsByTagName("Session"); 
    foreach($sessions as $session) 
    { 
    $visitors = $session->getElementsByTagName("Visitor"); 
    foreach($visitors as $visitor) 

    $sessionid = $session->getAttribute('realTimeID'); 
    { 

    $ips = $visitor->getElementsByTagName("ip"); 
    $ip = $ips->item(0)->nodeValue; 

    $agents = $visitor->getElementsByTagName("agent"); 
    $agent = $ips->item(0)->nodeValue; 

    echo "$sessionid- $ip- $agent\n"; 

}} 
    ?> 
+1

與Oracle沒有多大關係,而是在PHP中解析XML。 –

+0

是的,但我的最終目標是將數據加載到oracle數據中。如果我可以將數據轉換爲數組或類似的數據,我應該可以從那裏處理它。 – tsouth4

+0

請參閱我的答案中的代碼:) PHP DOM文檔(http://www.php.net/manual/en/book.dom.php)將幫助您開始使用(特別是此部分http://www.php。淨/手動/ EN/domdocument.getelementsbytagname.php)。 –

回答

0

我能夠使用simplexml_load_file而不是DOM方法來解決這個問題。雖然DOM在修改Leon的建議後工作,但下面的方法是我的建議。

$xml_object = simplexml_load_file('C:/Dev/report.xml'); 

foreach($xml_object->Session as $session) { 
     foreach($session->Visitor as $visitor) { 
     $ip = $visitor->ip; 
     $agent = $visitor->agent; 
    } 

echo $ip.','.$agent."\n"; 
} 
1

- >運算符在PHP意味着你正在嘗試調用的對象上的字段或方法。由於Report不是$ xml中的方法,因此您會收到錯誤信息,說明您試圖在非對象上調用屬性。

你可以嘗試這樣的事情(不知道它的工作原理,並沒有測試它並沒有很長一段時間寫的PHP,但你可以google一下):

$doc = new DOMDocument(); 
$doc->loadXML($content); 

foreach ($doc->getElementsByTagName('Session') as $node) 
{ 
    $agent = $node->getElementsByTagName('Visitor')->item(0)->getElementsByTagName('agent')->item(0)->nodeValue; 
} 

編輯:

添加的東西在PHP中的數組是很容易,因爲這:

$arr = array(); 
$arr[] = "some data"; 
$arr[] = "some more data"; 

PHP的陣列應該被看作是一個列表,因爲它們可以在運行中調整。

+0

感謝提示萊昂。它幫助我指出了正確的方向。我能夠得到這個工作。我已經在上面添加了我的新代碼。 – tsouth4

+0

現在我遇到了一些麻煩,試圖將數據轉換爲我可以在插入語句中使用的格式。在上面的例子中,我想插入兩行數據。我在上面的代碼中使用了硬回車,但是會想象我需要做一些改變,我不相信在試圖插入數據時會起作用。由於其他義務,我還沒有時間對插入物進行測試。 – tsouth4