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

使用PHP将XML数据加载到Oracle中,php,simplexml,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-2

虽然我已经编程几年了,但我对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>
在上面的代码中,我试图返回与每个访问者关联的代理。这将返回一个错误“尝试获取C:\PHP\chatterst.PHP第11行的非对象属性”

最终的结果是我将数据加载到一个类似于我提供的示例的表中,将两行加载到我的表中,这看起来类似于下面的示例,但是我认为如果我能够将数据加载到数组或类似的东西中,我可以处理这一点

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";

}}
  ?>

PHP中的->运算符表示您试图调用对象上的字段或方法。由于Report不是$xml中的一个方法,因此您将收到一个错误,即您试图调用非对象上的属性

您可以尝试这样的方法(不知道它是否有效,没有测试过它,很长时间没有编写PHP,但您可以用谷歌搜索它):

编辑:

在PHP中向数组添加内容很容易,如下所示:

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

PHP数组应该被视为一个列表,因为它们可以动态调整大小。

我可以使用simplexml加载文件而不是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";
}

与Oracle没有太多关系,而是在PHP.True中解析XML,但我的最终目标是将数据加载到Oracle数据中。如果我可以将数据放入数组或类似的东西中,那么我应该能够从那里处理它。请参阅我回答中的代码:)PHP DOM文档()将帮助您开始(特别是这一部分)。感谢您的提示Leon。这帮我指明了正确的方向。我能让它工作。我已经在上面添加了我的新代码。现在,我在尝试将数据转换为可以在insert语句中使用的格式时遇到了一些问题。在上面的示例中,我希望插入两行数据。我在上面的代码中使用了一个硬返回,但可以想象我需要做一些更改,我认为在尝试插入数据时,这些更改不起作用。由于其他义务,我还没有时间在insert中测试它。
$arr = array();
$arr[] = "some data";
$arr[] = "some more data";
$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";
}