我已将 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/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
最近,当我启动我的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
在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
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我不知道为什么,但是当我设置这个设置时它无法编译设置: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.