使用PHP将XML数据加载到Oracle中

时间:2012-05-16 18:33:26

标签: php simplexml

虽然我已经编程了几年,但我还不熟悉php。

我正在开发一个项目,最终目标是每晚将一个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时采用的方法。 file是将数据加载到数组中并从那里继续。

我很确定我可以使用类似的东西,也许可以为每个或类似的东西创建变量但是我不太确定如何使用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";

}}
  ?>

2 个答案:

答案 0 :(得分:1)

- &gt; 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数组应该被视为一个列表,因为它们可以动态调整大小。

答案 1 :(得分: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";
}