OKATO分類子データをMySqlデータベースにインポートする

ロシアの地域や都市の参考書を申請書に追加する必要が生じました。 私を訪問した最初のアイデアは、インターネット上の地域や都市を含む既製のXMLファイルを探し、成功した場合はデータをテーブルにインポートすることでした。 私が探し始めたとき、楽観主義は減少した。 もちろん、このデータを特別に用意してくれた人はいませんでしたが、驚くことではありません。 KLADRからSqlServerにKLADRとは異なる構造にデータをインポートした経験があるので、この偉業を再度繰り返し、KLADRからインポートを構造に整理する必要があると判断しました。 また、KLADRのデータはDBFテーブルに保存され、データをインポートするという事実を思い出しました MySqlデータベーステーブルで必要であり、構造はKLADRの構造よりも何倍も単純であり、次の図が描かれました:





しかし、KLADRに加えて、ロシアの住所分類子、たとえばOKATOがまだあることは知っていました。 仕事を始める前に、グーグルが提供するすべての分類子に慣れることに決めました。 OKATOを確認すると、この分類子は挿入要求のセットとして配布されていることがわかりました( ここから OKATOをダウンロードしてください )。



INSERT INTO `class_okato` (`id`, `name`, `code`, `control_number`, `parent_id`, `parent_code`, `node_count`, `additional_info`) VALUES(1, ' ', '01', 2, NULL, NULL, 3, ' '); INSERT INTO `class_okato` (`id`, `name`, `code`, `control_number`, `parent_id`, `parent_code`, `node_count`, `additional_info`) VALUES(2, '   /', '01200', 8, 1, '01', 60, NULL); INSERT INTO `class_okato` (`id`, `name`, `code`, `control_number`, `parent_id`, `parent_code`, `node_count`, `additional_info`) VALUES(3, '', '01201', 2, 2, '01200', 1, ' '); …
      
      







ロシアの地域や都市を取得したいという形で、より複雑な構造と、まったく必要のないデータ(たとえば、地域)だけが必要でした。 現在、最終バージョンを取得するための戦略は基本的に私のものではありませんが、変更されています。 dbfファイルに煩わされる必要はありません。必要なものは次のとおりです。





新しいデータベースのテーブルにデータを挿入し、sqlクエリを少し試して、必要なデータセットを正確に選択するクエリを受け取りました。 そして、私はすべての地域、領土、共和国、およびこれらの地域にある都市や町を選択する必要がありました。 私は大都市にもっと興味がありましたが、その存在から何も失うことはありませんでした。 次のリクエストを受け取りました。



 select ok1.name as name_region, ok2.name as name_city from class_okato ok1 left join class_okato ok2 on ok1.code like (substring(ok2.code,1,2)) where ok1.parent_id is null and ok2.parent_id is not null and ((ok2.code like ('%4__') and ok2.code not like ('%400')) or (ok2.code like ('%5__') and ok2.code not like ('%500') and ok2.code not like ('%550'))) order by ok1.name,ok2.name
      
      







MySqlまたはMsSqlに接続してクエリを実行できる多くのビジュアルスタジオでは、結果をXMLとして保存することもできます。 結果をXMLで保存すると、次の構造と内容のファイルが得られました。



 <?xml version="1.0"?> <SQL-query> <row> <name_region> </name_region> <name_city></name_city> </row> <row> <name_region> </name_region> <name_city></name_city> </row> <row> <name_region> </name_region> <name_city></name_city> </row>
      
      







次のステップは、XMLを挿入要求に変換するパーサーを開発することです。 VisualStudioを開いて、2つのフィールドを作成しました。1つはxmlを入力するはずでしたが、もう1つはリクエストを受信する予定でした。 すべての魔法が発生するはずのボタンをクリックしてボタンを追加し、xmlをリクエストに変換するコードを記述しました。



  private void btnXmlToSql_Click(object sender, EventArgs e) { const string elementRegion = "name_region"; const string elementCity = "name_city"; string sqlRegions = "INSERT INTO regions (id, name) VALUES ({0}, '{1}')"; string sqlCities = "INSERT INTO cities (id, name, region_id) VALUES ({0}, '{1}', {2})"; StringBuilder resultRegions = new StringBuilder(); StringBuilder resultCities = new StringBuilder(); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlTextBox.Text); var rowCollection = doc.GetElementsByTagName("row"); string storeRegion = null; string valRegion = ""; int idRegion = 0; int idCity = 0; for (int i = 0; i < rowCollection.Count; i++) { foreach (XmlNode node in rowCollection[i].ChildNodes) { if (node.Name == elementRegion) { valRegion = node.InnerText; if (storeRegion != valRegion) { idRegion++; resultRegions.Append(string.Format(sqlRegions, idRegion, valRegion)+";\r\n"); storeRegion = valRegion; } } if(node.Name == elementCity) { idCity++; resultCities.Append(string.Format(sqlCities, idCity, node.InnerText, idRegion)+";\r\n"); } } } sqlTextBox.Text = resultRegions.ToString()+ resultCities.ToString(); }
      
      







期待どおりの結果が得られました。1つのテキストフィールドでは受信したXMLをコピーするだけで、別のテキストフィールドでは挿入要求を受け取ります。



画像







All Articles