PHP 代码 - 从 Web 服务器 (/public_html/ctrackxml) 导入 xml 文件到 mysql 数据库

标签 php xml loops import

我已将 xml 文件导入 FTP 服务器。它以随机文件名和以下格式存储在位置“/public_html/ctrackxml/”中:

<message type="POSITIONDATA">
  <messageid>-1</messageid>
  <mobile>SNK261GP</mobile>
  <time>2012/01/20 08:34:45 AM</time>
  <latitude>-29.8477</latitude>
  <longitude>30.9554</longitude>
  <status>Driving</status>
  <speed>82</speed>
  <address> near Outer Ring Road (N2); Umkumbaan; in Durban</address>
  <direction>
  </direction>
  <runningodo>1587000</runningodo>
</message>

我需要遍历文件夹中的所有文件并将每个文件导入具有以下结构的 MySQL 数据库表 xmldata 中:

MySQL table

我需要将 xml 文件中的每个标记导入到表中的单独字段中。所以每个 xml 文件代表一个表条目。

根据我所做的研究,我似乎需要使用“LOAD XML LOCAL INFILE”mysql 语法,但我似乎无法让它直接在 mysql 中正常工作。

如果您能指出正确的方向,我将不胜感激。

更新

下面是我在另一个网站的帮助下拼凑而成的代码。 http://www.phpfreaks.com/forums/index.php?topic=244744.0

我测试了来自 phpfreaks 的脚本,它 100% 有效,但 xml 结构却大不相同。我已尝试修改代码以适合我的 xml 文件,但在使其正常工作时遇到了一些问题。

我的代码如下,但目前无法执行 foreach 语句:

<?php

echo "starting <br><br>";
//mysql connection
$con2 = mysql_connect("localhost","dbuser","dbpassword");
if (!$con2)  {  die('Could not connect: ' . mysql_error());  }
$selectdb = mysql_select_db("dbname", $con2);
if (!$selectdb)  { die('Database not used: ; ' . mysql_error());  }

echo "connected to DB<br/><br/>";

//simplexml load xml file   
$library =  simplexml_load_file('http://www.website/ctrackxml/CTO_20120119140006_0000.xml');

echo "xml loaded<br/><br/>";

//loop through parsed xmlfeed and print output      

foreach ($message->message as $message) {                  
printf("messageid: %s\n", $messageid->messageid);                  
printf("mobile: %s\n", $mobile->mobile);
printf("time: %s\n", $time->time);
printf("latitude: %s\n", $latitude->latitude);
printf("longitude: %s\n", $longitude->longitude);
printf("status: %s\n", $status->status);
printf("speed: %s\n", $speed->speed);
printf("address: %s\n", $address->address);
printf("direction: %s\n", $direction->direction);
printf("runningodo: %s\n", $runningodo->runningodo);

echo "xml parsed<br/><br/>";

//insert into databse                     
mysql_query("INSERT INTO xml (messageid, mobile, time,latitude,longitude,status,speed,address,direction,odometer)
VALUES (\"$messageid->messageid\", \"$mobile->mobile\", \"$time->time\", \"$latitude->latitude\", \"$longitude->longitude\", \"$status->status\", \"$speed->speed\", \"$address->address\", \"$direction->direction\", \"$runningodo->runningodo\")")
or die(mysql_error());

echo "inserted into mysql<br/><br/>";

//show updated records            
printf ("Records inserted: %d\n", mysql_affected_rows());  
}


//close connection 
mysql_close($con2);

?>

一如既往地感谢大家的帮助。

最佳答案

我最近从事的项目与您的要求有一些相似之处。正如查尔斯建议的那样,我使用 simplexml 进行解析。我的任务还需要通过 ftp 连接到服务器、获取文件、将它们解压缩到目录中等。

我的方法是编写一个处理一个文件的脚本,使用 simplexml 读取文档,进行一些简单的转换并将数据写入 mysql。

然后我创建了一个简单的 bash 脚本包装器,它读取目录中的所有文件,并将每个文件作为参数传递给我的处理脚本。

如果您发现您的结构足够接近以允许使用 LOAD XML,那么您根本不需要 PHP ... 只需要 bash 脚本和对 mysql 命令行客户端的重复调用。

php 脚本接受文件名作为命令行参数。当然这里指的是php CLI。它实际上是一个类,但是加载文件就这么简单:

if (file_exists($filename)) {
      $this->xml = simplexml_load_file($filename);

从那里您可以很容易地引用元素。这个 bash 脚本是我正在使用的典型脚本,您将所有 xml 文件所在的目录传递给它,它只是一一处理它们。

#!/bin/bash
if [ $# -ne 1 ]
then
  echo "No directory specified."
  exit 1
fi
DIR="$( cd "$( dirname "$0" )" && pwd )"
FILES="$1"/*.xml
for f in $FILES
  do
    /usr/bin/php -f /path/to/yourscript.php $f
done
exit 0

如果文档与您描述的完全一致,那么一旦您执行了我上面描述的加载(假设您有一个简单的类来促进您的 xml 变量,那么您只需要编写一个插入语句并使用 mysql_query 调用它函数。我实际上建议您调整架构,以便列类型准确匹配您为每一列获取的数据类型,而不是使用 varchars 来表示数字。这可以像这样简单:

$msg = $this->xml->message;

$query = "INSERT INTO YOUR TABLE (messageid, mobile...) VALUES ({$msg->message}, '{$msg->mobile}', ...)";
// assumes you already made db connection previously
$result = mysql_query($query);
if ($result) {
// inserted ok.
} else {
// something wrong, check mysql_error() for specifics
}

关于PHP 代码 - 从 Web 服务器 (/public_html/ctrackxml) 导入 xml 文件到 mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8938362/

相关文章:

c++ - 使用 C++ xerces 库时出现异常 "node is used in a different document than the one that created it"

c# - 如何从XML读取值?

python - 创建单个列表项的列表乘以 n 次

python - 无法访问Python中的嵌套字典

javascript - 我的表单提交和 jquery 问题

php - 逃离刀锋

php - 在坚持 Symfony2 形式和学说后重定向

php - cost 在 php 的 levenshtein 函数中比较字符串是什么意思?

java - Android:如何创建一个多功能区域来交换 XML 布局文件中的不同 View

c - 使用基于指针的条件时,即使循环条件为零,循环条件是否也有效?