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>
Google マップに再度インポートすると、ポイントは正しい住所/座標に配置されますが、左側のサイドバーの各ピンの横にある名前/説明には「?」しか表示されません。アドレスを表示する代わりに。
正規表現を使用して各 を検索し"<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 回少ない)。