我有一个KML文件,看起来像XML。我需要上传这个文件并更新MySQL数据库。数据如下:
<Document>
<name>GPSWaypoints-2020-10-16.kml</name>
<Style id="inline">
<LineStyle>
<color>ff0000ff</color>
<width>2</width>
</LineStyle>
</Style>
<Style id="waypoint">
<IconStyle>
<Icon><href>http://maps.google.com/mapfiles/kml/pal4/icon61.png</href></Icon>
</IconStyle>
</Style>
<Folder>
<name>Waypoints</name>
<open>1</open>
<Placemark>
<name>WPT 0011</name>
<TimeStamp><when>2020-09-26T08:21:14Z</when></TimeStamp>
<styleUrl>#waypoint</styleUrl>
<Point><coordinates>-74.91270224,10.8081995</coordinates></Point>
<ExtendedData>
<Data name="accuracy">
<displayName>Accuracy</displayName>
<value>3.216</value>
</Data>
<Data name="provider">
<displayName>Provider</displayName>
<value>gps</value>
</Data>
</ExtendedData>
</Placemark>
</Folder>
</Document>
</kml>
我有这个方法来导入KML文件:
public function uploadKML(Request $request)
{
$file = $request->file('kml');
$filename = $file->getClientOriginalName();
$filename = time() . "." . $request->kml->extension();
$file->move(public_path('kml'), $filename);
$path = $request->image->store('public');
return response()->json(["message" => "Upload Success"]);
}
现在,对于上传后的文件,我需要读取KML并使用表的相同ID更新坐标。
ID位于KML的名称字段中。例如,在字段<name> WPT 0011 </name>
中,如果不带WPT,ID将为0011。
我目前使用的更新方法是:
public function update(Request $request, $id)
{
$data= Data::findOrFail($id);
return $data->update($request->all());
}
这是我的数据模型:
<?php
class Data extends Model
{
protected $fillable = ['id', 'coordinates' ....];
}
3条答案
按热度按时间dtcbnfnu1#
首先,将文件交给XML解析器(如SimpleXML)。
然后,将所需信息从XML文件解析到变量(XML元素数组)中。
然后,使用SQL用数组元素的内容更新数据库。
对于每个KML文件中的一个id和几个坐标,如下所示(未经测试,只是输入一下以给予参考):
这可能不会像写的那样工作,但我希望它能给你足够的信息来构建你想要的。
您也可以使用正则表达式或其他方法从KML文件中解析坐标或任何其他信息,但“XML方式”是更明显、更优雅和更健壮的方式,但它要求您的KML是格式良好的XML。
e5nszbig2#
有两种方法
1.您可以将文件保存在物理位置并在数据库中引用
1.您可以根据文件大小使用blob数据类型、文本或长文本
zed5wv103#
1.将文件保存在永久存储器上。
您可以使用
move_uploaded_file
函数将文件保存在磁盘中,然后将文件名保存在数据库中作为字符串。2.使用
TEXT
字段类型将文件内容存储在数据库中。如果文件大小较大,我不推荐这种方法。
3.分析文件,然后更新结构化数据
使用
SimpleXML
或xml_parse
函数解析xml数据,然后处理解析后的数据。