草庐IT

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

coder 2024-07-03 原文

我已将 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 中:

我需要将 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/

有关PHP 代码 - 从 Web 服务器 (/public_html/ctrackxml) 导入 xml 文件到 mysql 数据库的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  6. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  9. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  10. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

随机推荐