我使用 BatchGeo 从电子表格创建地图,然后下载 KML 数据,即:
<Placemark>
<name>?</name>
<Snippet></Snippet>
<description><![CDATA[]]></description>
<styleUrl>#style75</styleUrl>
<address>1234 Example St Denver, CO 80221</address>
<Point>
<coordinates>-121.879364,37.815151,0.000000</coordinates>
</Point>
</Placemark>
当重新导入谷歌地图时,这些点被放置在正确的地址/坐标上,但左侧边栏上每个引脚旁边的名称/描述符只显示“?” 而不是显示地址。
我想使用正则表达式查找每个"<name>?</name>"
,然后使用正则表达式查找文件中的 NEXT 实例<address>.*</address>
,然后返回并将标签之间的 替换为?
标签<name>
之间*
的<address>
。
每个点的标签之间都有一段代码<Placemark>
,总共有数百个点。
以下是我到目前为止的点点滴滴:
newkml = File.open( 'Newkml.txt', 'w' )
def process_line(x)
unless x == "<name>?</name>"
# just return the original line
else
# Find the next instance of /<address>(.*)<\/address>/
# Go to the original line
# Replace it with "<name>#{$1}</name>"
end
end
File.foreach('Whatever.kml'){|line|} do line.process_line
# Make a new file, copy over all of the lines that aren't <name>?</name>,
# and fix the name lines using the method above
更新:在原始服务 (BatchGeo) 中,有一个选项可以设置哪些信息包含在哪些 KML(XML) 标签中,因此我创建了一个新地图并首先防止了问题的发生。感谢那些向我推荐我将来可以用于此类操作的工具的人。
更新 2:尝试 Mark Thomas 的解决方案。这是我运行的代码:
require 'rubygems'
require 'nokogiri'
doc = Nokogiri::XML("whatever.xml")
edits = 0
doc.xpath("//name").each do |name|
if name.content == "?"
name.content = name.xpath("following-sibling::address").text
edits +=1
end
end
puts( doc.inspect )
puts( "edits: #{edits}" )
puts doc
这给了我以下输出:
#<Nokogiri::XML::Document:0xfe0064 name="document>
edits: 0
<?xml version="1.0"?>
如果edits
我添加的测试代码按我认为的那样工作,它似乎表明该if name.content == "?"
块执行了 0 次(比我预期的少了大约 130 次)。