Google Maps Platform ওয়েব পরিষেবা হল Google পরিষেবার HTTP ইন্টারফেসের একটি সংগ্রহ যা আপনার ম্যাপ অ্যাপ্লিকেশনের জন্য ভৌগোলিক ডেটা প্রদান করে।
এই নির্দেশিকায় আপনার ওয়েব পরিষেবা অনুরোধ সেট-আপ করা এবং পরিষেবার উত্তর প্রসেস করার জন্য উপযোগী কিছু সাধারণ পদ্ধতি বর্ণনা করা হয়েছে। Geocoding API-এর সম্পূর্ণ ডকুমেন্টেশনের জন্য ডেভেলপার গাইড দেখুন।
ওয়েব পরিষেবা কী?
Google Maps Platform ওয়েব পরিষেবা হল এক্সটার্নাল পরিষেবা থেকে Maps API ডেটার অনুরোধ করা এবং আপনার Maps অ্যাপ্লিকেশনের মধ্যে ডেটা ব্যবহার করার জন্য একটি ইন্টারফেস। এইসব পরিষেবা Google Maps Platform পরিষেবার শর্তাবলীতে উল্লিখিত লাইসেন্স সংক্রান্ত বিধিনিষেধ অনুযায়ী ম্যাপের সাথে একসাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে।
Maps API ওয়েব পরিষেবা নির্দিষ্ট URL-এ HTTP(S) অনুরোধ ব্যবহার করে, URL প্যারামিটার এবং/অথবা JSON-ফর্ম্যাট POST ডেটা পরিষেবায় আর্গুমেন্ট হিসেবে পাস করে। সাধারণত, এইসব পরিষেবা আপনার অ্যাপ্লিকেশন দ্বারা পার্সিং এবং/অথবা প্রসেসিংয়ের জন্য JSON বা XML হিসেবে রেসপন্স বডিতে ডেটা রিটার্ন করে।
সাধারণত Geocoding API সংক্রান্ত অনুরোধ নিম্নলিখিত ফর্মের মতো হয়:
https://maps.googleapis.com/maps/api/geocode/output?parameters
যেখানে output উত্তরের ফর্ম্যাট (সাধারণত
json বা xml) নির্দেশ করে।
মনে রাখবেন: সব Geocoding API অ্যাপ্লিকেশনের জন্য যাচাইকরণ প্রয়োজন। যাচাইকরণ ক্রেডেনশিয়াল সম্পর্কে আরও তথ্য পান।
SSL/TLS অ্যাক্সেস
API কী ব্যবহার করে বা ব্যবহারকারীর ডেটা আছে এমন সব Google Maps Platform অনুরোধের জন্য HTTPS প্রয়োজন। HTTP-এর মাধ্যমে করা অনুরোধে সংবেদনশীল ডেটা থাকলে তা বাতিল করা হতে পারে।
সঠিক URL তৈরি করা
আপনি হয়ত মনে করতে পারেন যে "সঠিক" URL বলতে কী বোঝায় তা সহজেই বোঝা যায়, কিন্তু
বিষয়টি তা নয়। ব্রাউজারের অ্যাড্রেস বারে লেখা URL-এ বিশেষ অক্ষর (যেমন,
"上海+中國") থাকতে পারে; ব্রাউজারকে ট্রান্সমিশনের আগে ইন্টার্নালি সেইসব অক্ষরকে
অন্য এনকোডিংয়ে ট্রান্সলেট করতে হয়।
একইভাবে, UTF-8 ইনপুট
জেনারেট বা গ্রহণ করে এমন যেকোনও কোড UTF-8 অক্ষর সহ URL-কে "সঠিক" হিসেবে বিবেচনা করতে পারে, কিন্তু ওয়েব সার্ভারে পাঠানোর আগে সেইসব অক্ষরকে
ট্রান্সলেট করতে হবে।
এই প্রসেসকে
URL-এনকোডিং বা পার্সেন্ট-এনকোডিং বলা হয়।
বিশেষ অক্ষর
আমাদের বিশেষ অক্ষরগুলি অনুবাদ করতে হবে কারণ সব URL-কে ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (URI) স্পেসিফিকেশন দ্বারা নির্দিষ্ট সিনট্যাক্স মেনে চলতে হবে। এর অর্থ হল, URL-এ অবশ্যই ASCII অক্ষরের একটি বিশেষ সাবসেট থাকতে হবে: পরিচিত বর্ণসংখ্যাসূচক চিহ্ন এবং URL-এর মধ্যে কন্ট্রোল অক্ষর হিসেবে ব্যবহারের জন্য কিছু সংরক্ষিত অক্ষর। এই সারণীতে এইসব অক্ষরের সংক্ষিপ্তসার দেওয়া হল:
| সেট করুন | অক্ষর | URL ব্যবহার |
|---|---|---|
| বর্ণসাংখ্যিক | a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 | টেক্সট স্ট্রিং, স্কিম ব্যবহার (http), পোর্ট (8080) ইত্যাদি। |
| রিজার্ভ করা নেই | - _ . ~ | টেক্সট স্ট্রিং |
| রিজার্ভ করা | ! * ' ( ) ; : @ & = + $ , / ? % # [ ] | কন্ট্রোল ক্যারেক্টার এবং/অথবা টেক্সট স্ট্রিং |
সঠিক URL তৈরি করার সময়, আপনাকে নিশ্চিত করতে হবে যে এতে শুধুমাত্র টেবিলে দেখানো অক্ষরগুলিই রয়েছে। এই অক্ষর সেট ব্যবহার করার জন্য কোনও URL কনফার্ম করলে সাধারণত দুটি সমস্যা হয়, একটি হল বাদ দেওয়া এবং অন্যটি হল প্রতিস্থাপন করা:
- আপনি যেসব অক্ষর হ্যান্ডেল করতে চান সেগুলি উপরের সেটের
বাইরে আছে। যেমন, বিদেশি ভাষার অক্ষর
যেমন
上海+中國-কে উপরের অক্ষর ব্যবহার করে এনকোড করতে হবে। জনপ্রিয় কনভেনশন অনুযায়ী, স্পেস (যা URL-এর মধ্যে ব্যবহার করা যায় না) প্রায়ই প্লাস'+'চিহ্ন ব্যবহার করে দেখানো হয়। - উপরে উল্লিখিত সেটের মধ্যে অক্ষরগুলি রিজার্ভ করা অক্ষর হিসেবে বিদ্যমান,
কিন্তু আক্ষরিক অর্থে ব্যবহার করতে হবে।
যেমন, URL-এর মধ্যে
?ব্যবহার করা হয় কোয়েরি স্ট্রিংয়ের শুরু বোঝাতে; আপনি যদি "? and the Mysterions" স্ট্রিং ব্যবহার করতে চান, তাহলে আপনাকে'?'ক্যারেক্টার এনকোড করতে হবে।
URL-এনকোড করা সব অক্ষরকে '%' অক্ষর ও সেগুলির UTF-8 অক্ষরের
সাথে সম্পর্কিত দুই-অক্ষরের হেক্স
ভ্যালু ব্যবহার করে এনকোড করা হয়। যেমন,
上海+中國 UTF-8-এ থাকলে, URL-এনকোড করা হলে তা
%E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B হয়ে যাবে। ? and the Mysterians স্ট্রিংটি URL-এনকোড করা হলে
%3F+and+the+Mysterians বা %3F%20and%20the%20Mysterians
হিসেবে দেখানো হবে।
এনকোড করতে হবে এমন সাধারণ অক্ষর
কিছু সাধারণ অক্ষর যা অবশ্যই এনকোড করতে হবে:
| অসুরক্ষিত ক্যারেক্টার | এনকোড করা ভ্যালু |
|---|---|
| স্পেস | %20 |
| " | %22 |
| < | %3C |
| > | %3E |
| # | %23 |
| % | %25 |
| | | %7C |
ব্যবহারকারীর ইনপুট থেকে পাওয়া URL কনভার্ট করা কখনও কখনও কঠিন হয়ে পড়ে। যেমন, কোনও ব্যবহারকারী ঠিকানা হিসেবে "5th&Main St." লিখতে পারেন। সাধারণত, আপনার URL-এর বিভিন্ন অংশ থেকে URL তৈরি করা উচিত, ব্যবহারকারীর ইনপুটকে আক্ষরিক অক্ষর হিসেবে বিবেচনা করা উচিত।
এছাড়াও, সব Google Maps Platform ওয়েব পরিষেবা ও স্ট্যাটিক ওয়েব API-এর জন্য URL ১৬৩৮৪টি অক্ষরের মধ্যে সীমাবদ্ধ। বেশিরভাগ পরিষেবার ক্ষেত্রে, এই অক্ষর সীমা খুব কমই পূরণ হয়। তবে, মনে রাখবেন, নির্দিষ্ট কিছু পরিষেবায় একাধিক প্যারামিটার থাকে যার ফলে URL অনেক বড় হতে পারে।
Google API-এর ভদ্রতাপূর্ণ ব্যবহার
খারাপভাবে ডিজাইন করা API ক্লায়েন্ট, ইন্টারনেট ও Google-এর সার্ভারে প্রয়োজনের চেয়ে বেশি লোড দিতে পারে। এই বিভাগে API ক্লায়েন্টদের জন্য কিছু পেশাদার পদ্ধতি রয়েছে। এইসব পেশাদার পদ্ধতি অনুসরণ করলে, API-এর অনিচ্ছাকৃত অপব্যবহারের কারণে আপনার অ্যাপ্লিকেশন ব্লক হওয়া এড়াতে পারবেন।
সমস্যা ম্যানেজ করা ও আবার চেষ্টা করা
Geocoding API থেকে পাওয়া UNKNOWN_ERROR বা OVER_QUERY_LIMIT রেসপন্স কোড সম্পর্কে
আরও জানতে, সমস্যা ম্যানেজ করা ও আবার চেষ্টা করা সম্পর্কে পড়ুন।
এক্সপোনেনশিয়াল ব্যাকঅফ
খুব কম ক্ষেত্রে, আপনার অনুরোধ পূরণ করার সময় কোনও সমস্যা হতে পারে; আপনি 4XX বা 5XX HTTP রেসপন্স কোড পেতে পারেন অথবা আপনার ক্লায়েন্ট ও Google-এর সার্ভারের মধ্যে TCP কানেকশন কোনও কারণে কাজ নাও করতে পারে। প্রায়শই অনুরোধটি আবার করে দেখা ভাল, কারণ প্রথমবার অনুরোধটি সম্পূর্ণ না হলেও ফলো-আপ অনুরোধটি সম্পূর্ণ হতে পারে। তবে, Google-এর সার্ভারে বারবার অনুরোধ লুপ করা গুরুত্বপূর্ণ নয়। এই লুপ করার আচরণ আপনার ক্লায়েন্ট ও Google-এর মধ্যে নেটওয়ার্কে ওভারলোড করতে পারে, যার ফলে অনেক পার্টি সমস্যায় পড়তে পারে।
আরও ভালো উপায় হল, প্রতিটি প্রচেষ্টার মধ্যে সময়ের ব্যবধান বাড়িয়ে আবার চেষ্টা করা। সাধারণত, প্রতিটি প্রচেষ্টার সাথে বিলম্বের সময় গুণিতক ফ্যাক্টর দ্বারা বৃদ্ধি করা হয়, এই পদ্ধতিটি এক্সপোনেনশিয়াল ব্যাকঅফ নামে পরিচিত।
যেমন, ধরুন কোনও অ্যাপ্লিকেশন টাইম জোন API-তে এই অনুরোধ করতে চায়:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEYনিম্নলিখিত Python উদাহরণ থেকে কীভাবে এক্সপোনেনশিয়াল ব্যাকঅফ সহ অনুরোধ করতে হয় তা জানুন:
import json import time import urllib.error import urllib.parse import urllib.request # The maps_key defined below isn't a valid Google Maps API key. # You need to get your own API key. # See https://developers.google.com/maps/documentation/timezone/get-api-key API_KEY = "YOUR_KEY_HERE" TIMEZONE_BASE_URL = "https://maps.googleapis.com/maps/api/timezone/json" def timezone(lat, lng, timestamp): # Join the parts of the URL together into one string. params = urllib.parse.urlencode( {"location": f"{lat},{lng}", "timestamp": timestamp, "key": API_KEY,} ) url = f"{TIMEZONE_BASE_URL}?{params}" current_delay = 0.1 # Set the initial retry delay to 100ms. max_delay = 5 # Set the maximum retry delay to 5 seconds. while True: try: # Get the API response. response = urllib.request.urlopen(url) except urllib.error.URLError: pass # Fall through to the retry loop. else: # If we didn't get an IOError then parse the result. result = json.load(response) if result["status"] == "OK": return result["timeZoneId"] elif result["status"] != "UNKNOWN_ERROR": # Many API errors cannot be fixed by a retry, e.g. INVALID_REQUEST or # ZERO_RESULTS. There is no point retrying these requests. raise Exception(result["error_message"]) if current_delay > max_delay: raise Exception("Too many retry attempts.") print("Waiting", current_delay, "seconds before retrying.") time.sleep(current_delay) current_delay *= 2 # Increase the delay each time we retry. if __name__ == "__main__": tz = timezone(39.6034810, -119.6822510, 1331161200) print(f"Timezone: {tz}")
আপনাকে আরও সতর্ক থাকতে হবে যাতে অ্যাপ্লিকেশন কল চেনে রিট্রাই কোড বেশি না থাকে, যার ফলে খুব দ্রুত একের পর এক অনুরোধ করা হয়।
সিঙ্ক্রোনাইজ করা অনুরোধ
Google-এর API-তে সিঙ্ক করা অনুরোধের সংখ্যা বেশি হলে, তা Google-এর পরিকাঠামোয় ডিস্ট্রিবিউটেড ডিনায়াল অফ সার্ভিস (DDoS) অ্যাটাকের মতো মনে হতে পারে এবং সেই অনুযায়ী ব্যবস্থা নেওয়া হবে। এটি এড়াতে, আপনাকে নিশ্চিত করতে হবে যে API অনুরোধগুলি ক্লায়েন্টদের মধ্যে সিঙ্ক করা হয়নি।
যেমন, এমন একটি অ্যাপ্লিকেশন বিবেচনা করুন যা বর্তমান টাইম জোনে সময় দেখায়। এই অ্যাপ্লিকেশনটি সম্ভবত ক্লায়েন্ট অপারেটিং সিস্টেমে একটি অ্যালার্ম সেট করবে যা মিনিটের শুরুতে এটি জাগিয়ে তুলবে যাতে প্রদর্শিত সময় আপডেট করা যায়। অ্যাপ্লিকেশনটি সেই অ্যালার্মের সাথে যুক্ত প্রসেসিংয়ের অংশ হিসেবে কোনও API কল করবে না।
একটি নির্দিষ্ট অ্যালার্মের উত্তরে API কল করা খারাপ কারণ এর ফলে API কলগুলি মিনিটের শুরুতে সিঙ্ক্রোনাইজ করা হয়, এমনকি বিভিন্ন ডিভাইসের মধ্যেও, সময়ের সাথে সমানভাবে বিতরণ করার পরিবর্তে। কোনও খারাপভাবে ডিজাইন করা অ্যাপ্লিকেশন এটি করলে, প্রতিটি মিনিটের শুরুতে স্বাভাবিক লেভেলের ষাট গুণ ট্রাফিক স্পাইক তৈরি হবে।
এর পরিবর্তে, একটি সম্ভাব্য ভালো ডিজাইন হল, র্যান্ডম হিসেবে বেছে নেওয়া সময়ে দ্বিতীয় অ্যালার্ম সেট করা। এই দ্বিতীয় অ্যালার্মটি চালু হলে, অ্যাপ্লিকেশনটি প্রয়োজনীয় যেকোনও API কল করে এবং ফলাফল স্টোর করে। মিনিটের শুরুতে অ্যাপ্লিকেশনটি যখন তার ডিসপ্লে আপডেট করতে চায়, তখন এটি API-কে আবার কল করার পরিবর্তে আগে সেভ করা ফলাফল ব্যবহার করে। এই পদ্ধতিতে, API কলগুলি সময়ের সাথে সমানভাবে ছড়িয়ে পড়ে। এছাড়াও, ডিসপ্লে আপডেট করা হলে API কল রেন্ডারিংয়ে দেরি করে না।
মিনিটের শুরু ছাড়াও, অন্যান্য সাধারণ সিঙ্ক করার সময় যেগুলি টার্গেট করার ব্যাপারে আপনাকে সতর্ক থাকতে হবে না, সেগুলি হল ঘণ্টার শুরু এবং প্রতিদিন মধ্যরাতে দিনের শুরু।
প্রতিক্রিয়া প্রসেস করা হচ্ছে
এই বিভাগে, কীভাবে ওয়েব পরিষেবা থেকে পাওয়া উত্তর থেকে এই ভ্যালুগুলি ডাইনামিক উপায়ে এক্সট্র্যাক্ট করা যায় তা আলোচনা করা হয়েছে।
Google Maps ওয়েব পরিষেবা এমন উত্তর দেয় যা সহজে বোঝা যায়, কিন্তু তা ঠিক ব্যবহারকারী-বান্ধব নয়। কোয়েরি করার সময়, ডেটার সেট দেখানোর পরিবর্তে, আপনি সম্ভবত কয়েকটি নির্দিষ্ট ভ্যালু এক্সট্র্যাক্ট করতে চান। সাধারণত, আপনি ওয়েব পরিষেবা থেকে পাওয়া উত্তর পার্স করতে এবং শুধুমাত্র আপনার আগ্রহের ভ্যালু এক্সট্র্যাক্ট করতে চাইবেন।
আপনি XML বা JSON-এ আউটপুট রিটার্ন করছেন কিনা তার উপর নির্ভর করে আপনি কোন পার্সিং স্কিম ব্যবহার করবেন। JSON উত্তরগুলি যেহেতু আগে থেকেই জাভাস্ক্রিপ্ট অবজেক্টের আকারে থাকে, তাই সেগুলি ক্লায়েন্টে জাভাস্ক্রিপ্টের মধ্যেই প্রসেস করা যেতে পারে। XML ফর্ম্যাটের মধ্যে থাকা এলিমেন্টকে অ্যাড্রেস করতে XML প্রসেসর ও XML কোয়েরি ল্যাঙ্গুয়েজ ব্যবহার করে XML উত্তর প্রসেস করতে হবে। আমরা নিম্নলিখিত উদাহরণে XPath ব্যবহার করি, কারণ এটি সাধারণত XML প্রসেসিং লাইব্রেরিতে কাজ করে।
XPath-এর মাধ্যমে XML প্রসেস করা
XML হল তুলনামূলকভাবে উন্নত স্ট্রাকচার্ড তথ্যের ফর্ম্যাট যা
ডেটা ইন্টারচেঞ্জের জন্য ব্যবহার করা হয়। যদিও এটি JSON-এর মতো হালকা নয়, XML
আরও বেশি ভাষা ও আরও শক্তিশালী টুল প্রদান করে। Java-তে XML প্রসেস করার কোড, যেমন, javax.xml প্যাকেজে
ইন-বিল্ট থাকে।
XML উত্তর প্রসেস করার সময়, XML ডকুমেন্টের মধ্যে নোড বেছে নেওয়ার জন্য আপনাকে উপযুক্ত কোয়েরি ভাষা ব্যবহার করতে হবে, এর পরিবর্তে XML মার্ক-আপের মধ্যে এলিমেন্ট সম্পূর্ণ পজিশনে আছে বলে ধরে নিলে চলবে না। XPath হল একটি ভাষা সিনট্যাক্স যা XML ডকুমেন্টের মধ্যে নোড এবং এলিমেন্টকে অনন্যভাবে বর্ণনা করে। XPath এক্সপ্রেশন আপনাকে XML উত্তর ডকুমেন্টের মধ্যে নির্দিষ্ট কন্টেন্ট শনাক্ত করতে দেয়।
XPath এক্সপ্রেশন
XPath সম্পর্কে কিছু পরিচিতি একটি শক্তিশালী পার্সিং স্কিম তৈরি করার ক্ষেত্রে অনেক দূর এগিয়ে যায়। এই বিভাগে, XPath-এর মাধ্যমে XML ডকুমেন্টের মধ্যে থাকা এলিমেন্ট কীভাবে অ্যাড্রেস করা হয়, তার উপর ফোকাস করা হবে। এর ফলে, আপনি একাধিক এলিমেন্ট অ্যাড্রেস করতে এবং জটিল কোয়েরি তৈরি করতে পারবেন।
XPath, XML ডকুমেন্টের মধ্যে থেকে এলিমেন্ট বেছে নিতে এক্সপ্রেশন ব্যবহার করে। এটি ডিরেক্টরি পাথের জন্য ব্যবহৃত সিনট্যাক্সের মতোই। এই এক্সপ্রেশনগুলি XML ডকুমেন্ট ট্রির মধ্যে এলিমেন্ট শনাক্ত করে, যা DOM-এর মতো একটি হায়ারার্কিক্যাল ট্রি। সাধারণত, XPath এক্সপ্রেশনগুলি লোভী হয়, এর অর্থ হল যে সেগুলি প্রদত্ত মানদণ্ড পূরণ করে এমন সব নোডের সাথে ম্যাচ করবে।
আমাদের উদাহরণগুলি ব্যাখ্যা করার জন্য আমরা নিম্নলিখিত অ্যাবস্ট্রাক্ট XML ব্যবহার করব:
<WebServiceResponse> <status>OK</status> <result> <type>sample</type> <name>Sample XML</name> <location> <lat>37.4217550</lat> <lng>-122.0846330</lng> </location> </result> <result> <message>The secret message</message> </result> </WebServiceResponse>
এক্সপ্রেশনে নোড বেছে নেওয়া
XPath সিলেকশন নোড বেছে নেয়। রুট নোড
পুরো ডকুমেন্টকে অন্তর্ভুক্ত করে। আপনি "/" বিশেষ এক্সপ্রেশন ব্যবহার করে এই নোডটি বেছে নেন। মনে রাখবেন যে রুট
নোডটি আপনার XML ডকুমেন্টের সবচেয়ে উপরের লেভেলের নোড নয়; আসলে,
এটি এই সবচেয়ে উপরের লেভেলের এলিমেন্টের এক লেভেল উপরে থাকে এবং
সেটি অন্তর্ভুক্ত করে।
এলিমেন্ট নোড XML ডকুমেন্ট ট্রির মধ্যে বিভিন্ন এলিমেন্টকে
উপস্থাপিত করে। একটি <WebServiceResponse> এলিমেন্ট,
যেমন, উপরে আমাদের স্যাম্পেল পরিষেবায়
ফেরত পাঠানো টপ-লেভেল এলিমেন্টকে দেখায়। আপনি অ্যাবসোলিউট বা রিলেটিভ পাথের মাধ্যমে
আলাদা আলাদা নোড বেছে নিতে পারেন, যা "/" অক্ষর
আছে নাকি নেই তার মাধ্যমে বোঝা যায়।
- সম্পূর্ণ পাথ: "
/WebServiceResponse/result" এক্সপ্রেশনটি<result>নোডের চাইল্ড নোড হিসেবে থাকা<WebServiceResponse>নোডের সবকটি নোড বেছে নেয়। (মনে রাখবেন, এই দুটি এলিমেন্টই মূল নোড "/" থেকে এসেছে।) - বর্তমান প্রসঙ্গ থেকে আপেক্ষিক পাথ: এক্সপ্রেশন
"
result" বর্তমান প্রসঙ্গ থেকে যেকোনও<result>এলিমেন্টের সাথে ম্যাচ করবে। সাধারণত, আপনাকে প্রসঙ্গ নিয়ে চিন্তা করতে হবে না, কারণ আপনি সাধারণত একটি এক্সপ্রেশনের মাধ্যমে ওয়েব পরিষেবার ফলাফল প্রসেস করছেন।
এইসব এক্সপ্রেশনের যেকোনও একটিকে ওয়াইল্ডকার্ড পাথ যোগ করার মাধ্যমে
আরও বাড়ানো যেতে পারে, এটি ডবল স্ল্যাশ ("//") দিয়ে বোঝানো হয়।
এই ওয়াইল্ডকার্ড ইঙ্গিত করে যে মধ্যবর্তী পাথে
শূন্য বা তার বেশি এলিমেন্ট ম্যাচ করতে পারে। XPath এক্সপ্রেশন "//formatted_address,"
যেমন, বর্তমান ডকুমেন্টে সেই নামের সব নোডের সাথে ম্যাচ করবে।
//viewport//lat এক্সপ্রেশনটি <viewport>
কে পেরেন্ট হিসেবে ট্রেস করতে পারে এমন সব
<lat> এলিমেন্টের সাথে ম্যাচ করবে।
ডিফল্ট হিসেবে, XPath এক্সপ্রেশন সব এলিমেন্টের সাথে ম্যাচ করে। আপনি প্রেডিকেট প্রদান করে এক্সপ্রেশনকে
নির্দিষ্ট এলিমেন্টের সাথে ম্যাচ করার জন্য সীমাবদ্ধ করতে পারেন,
যা স্কোয়ার ব্র্যাকেটের ([]) মধ্যে থাকে। XPath
এক্সপ্রেশন "/GeocodeResponse/result[2] সবসময়
দ্বিতীয় ফলাফল রিটার্ন করে, যেমন।
| এক্সপ্রেশনের ধরন | |
|---|---|
| রুট নোড | XPath এক্সপ্রেশন: "
/"বেছে নেওয়া:
<WebServiceResponse>
<status>OK</status>
<result>
<type>sample</type>
<name>Sample XML</name>
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
</result>
<result>
<message>The secret message</message>
</result>
</WebServiceResponse>
|
| অ্যাবসোলিউট পাথ | XPath এক্সপ্রেশন: "
/WebServiceResponse/result"বেছে নেওয়া:
<result>
<type>sample</type>
<name>Sample XML</name>
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
</result>
<result>
<message>The secret message</message>
</result>
|
| ওয়াইল্ডকার্ড সহ পাথ | XPath এক্সপ্রেশন: "
/WebServiceResponse//location"বেছে নেওয়া:
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
|
| প্রেডিকেট সহ পাথ | XPath এক্সপ্রেশন: "
/WebServiceResponse/result[2]/message"বেছে নেওয়া:
<message>The secret message</message>
|
প্রথম result-এর সব ডাইরেক্ট চিলড্রেন |
XPath এক্সপ্রেশন: "
/WebServiceResponse/result[1]/*"বেছে নেওয়া:
<type>sample</type>
<name>Sample XML</name>
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
|
result-এর name
যার type টেক্সট হল "স্যাম্পেল।" |
XPath এক্সপ্রেশন: "
/WebServiceResponse/result[type/text()='sample']/name"বেছে নেওয়া:
Sample XML
|
মনে রাখা গুরুত্বপূর্ণ যে এলিমেন্ট বেছে নেওয়ার সময়, আপনি নোড বেছে নেন, শুধু সেইসব অবজেক্টের মধ্যে থাকা টেক্সট নয়। সাধারণত, আপনি সবকটি ম্যাচ করা নোড নিয়ে ইটারেট করতে এবং টেক্সট এক্সট্র্যাক্ট করতে চাইবেন। আপনি সরাসরি টেক্সট নোডও ম্যাচ করতে পারেন; নিচে টেক্সট নোড দেখুন।
মনে রাখবেন যে XPath অ্যাট্রিবিউট নোডও সাপোর্ট করে; তবে, সব Google Maps ওয়েব পরিষেবা অ্যাট্রিবিউট ছাড়াই এলিমেন্ট পরিবেশন করে, তাই অ্যাট্রিবিউট ম্যাচ করার প্রয়োজন নেই।
এক্সপ্রেশনে টেক্সট বেছে নেওয়া
XML ডকুমেন্টের মধ্যে থাকা টেক্সট XPath এক্সপ্রেশনে টেক্সট নোড অপারেটরের মাধ্যমে
উল্লেখ করা হয়। এই অপারেটর "text()"
নির্দেশিত নোড থেকে টেক্সট এক্সট্র্যাকশন নির্দেশ করে। যেমন,
XPath এক্সপ্রেশন "//formatted_address/text()" <formatted_address>
এলিমেন্টের মধ্যে থাকা
সব টেক্সট রিটার্ন করবে।
| এক্সপ্রেশনের ধরন | |
|---|---|
| সব টেক্সট নোড (হোয়াইটস্পেস সহ) | XPath এক্সপ্রেশন: "
//text()"বেছে নেওয়া:
sample
Sample XML
37.4217550
-122.0846330
The secret message
|
| টেক্সট বেছে নেওয়া | XPath এক্সপ্রেশন: "
/WebServiceRequest/result[2]/message/text()"বেছে নেওয়া:
The secret message
|
| প্রসঙ্গ অনুযায়ী বেছে নেওয়া | XPath এক্সপ্রেশন: "
/WebServiceRequest/result[type/text() = 'sample']/name/text()"বেছে নেওয়া:
Sample XML
|
বিকল্প হিসেবে, আপনি কোনও এক্সপ্রেশন মূল্যায়ন করতে পারেন এবং নোডের একটি সেট রিটার্ন করতে পারেন এবং তারপরে সেই "নোড সেট" জুড়ে ইটারেট করতে পারেন, প্রতিটি নোড থেকে টেক্সট এক্সট্র্যাক্ট করতে পারেন। নিচের উদাহরণে আমরা এই পদ্ধতি ব্যবহার করেছি।
XPath সম্পর্কে আরও জানতে, XPath W3C স্পেসিফিকেশন দেখুন।
Java-তে XPath মূল্যায়ন করা
Java-তে XML পার্স করা এবং javax.xml.xpath.* প্যাকেজের মধ্যে XPath এক্সপ্রেশন ব্যবহার করার জন্য ব্যাপক সহায়তা রয়েছে।
সেই কারণে, এই বিভাগে স্যাম্পেল কোড Java ব্যবহার করে
XML পরিষেবা থেকে পাওয়া উত্তরের XML কীভাবে ম্যানেজ ও ডেটা পার্স করতে হয় তা দেখায়।
আপনার Java কোডে XPath ব্যবহার করতে, আপনাকে প্রথমে
একটি XPathFactory-এর ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করতে হবে এবং
XPath
অবজেক্ট তৈরি করতে সেই ফ্যাক্টরিতে newXPath() কল করতে হবে। এই অবজেক্টটি তারপরে evaluate() পদ্ধতি ব্যবহার করে পাস করা XML
এবং XPath এক্সপ্রেশন প্রসেস করতে পারে।
XPath এক্সপ্রেশন মূল্যায়ন করার সময়, নিশ্চিত করুন যে আপনি সম্ভাব্য "নোড সেট" যা রিটার্ন করা হতে পারে তার
উপর পুনরাবৃত্তি করেছেন। এইসব ফলাফল Java কোডে DOM নোড হিসেবে দেখানো হয়, তাই আপনাকে NodeList অবজেক্টের মধ্যে এই ধরনের একাধিক ভ্যালু ক্যাপচার করতে হবে এবং সেইসব নোড থেকে যেকোনও টেক্সট বা ভ্যালু এক্সট্র্যাক্ট করতে সেই অবজেক্টের উপর ইটারেট করতে হবে।
নিম্নলিখিত কোড থেকে বোঝা যাবে যে কীভাবে একটি XPath
অবজেক্ট তৈরি করতে হয়, সেটিতে XML ও XPath এক্সপ্রেশন অ্যাসাইন করতে হয় এবং
প্রাসঙ্গিক কন্টেন্ট প্রিন্ট করার জন্য এক্সপ্রেশন মূল্যায়ন করতে হয়।
import org.xml.sax.InputSource; import org.w3c.dom.*; import javax.xml.xpath.*; import java.io.*; public class SimpleParser { public static void main(String[] args) throws IOException { XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); try { System.out.print("Web Service Parser 1.0\n"); // In practice, you'd retrieve your XML via an HTTP request. // Here we simply access an existing file. File xmlFile = new File("XML_FILE"); // The xpath evaluator requires the XML be in the format of an InputSource InputSource inputXml = new InputSource(new FileInputStream(xmlFile)); // Because the evaluator may return multiple entries, we specify that the expression // return a NODESET and place the result in a NodeList. NodeList nodes = (NodeList) xpath.evaluate("XPATH_EXPRESSION", inputXml, XPathConstants.NODESET); // We can then iterate over the NodeList and extract the content via getTextContent(). // NOTE: this will only return text for element nodes at the returned context. for (int i = 0, n = nodes.getLength(); i < n; i++) { String nodeString = nodes.item(i).getTextContent(); System.out.print(nodeString); System.out.print("\n"); } } catch (XPathExpressionException ex) { System.out.print("XPath Error"); } catch (FileNotFoundException ex) { System.out.print("File Error"); } } }