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


Use PHP to load XML Data into Oracle

我对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 时采用的方法。文件是将数据加载到数组中并从那里继续。

我很确定我可以使用类似的东西,

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

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

你可以

尝试这样的东西(不知道它是否有效,没有测试它,很久没有写PHP,但你可以谷歌一下(:

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

我能够使用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";
}