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