-1

尽管我已经编程了几年,但我对 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";

}}
  ?>
4

2 回答 2

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

于 2012-05-16T20:02:42.967 回答
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";
}
于 2012-06-01T17:38:51.427 回答