Google Maps Platform ওয়েব পরিষেবা হল Google পরিষেবার HTTP ইন্টারফেসের একটি সংগ্রহ যা আপনার ম্যাপ অ্যাপ্লিকেশনের জন্য ভৌগোলিক ডেটা প্রদান করে।
এই নির্দেশিকায় আপনার ওয়েব পরিষেবা অনুরোধ সেট-আপ করা এবং পরিষেবার উত্তর প্রসেস করার জন্য উপযোগী কিছু সাধারণ পদ্ধতি বর্ণনা করা হয়েছে। Time Zone API-এর সম্পূর্ণ ডকুমেন্টেশনের জন্য ডেভেলপার নির্দেশিকা দেখুন।
ওয়েব পরিষেবা কী?
Google Maps Platform ওয়েব পরিষেবা হল Maps API ডেটা এক্সটার্নাল পরিষেবা থেকে অনুরোধ করা এবং আপনার Maps অ্যাপ্লিকেশনের মধ্যে ডেটা ব্যবহার করার একটি ইন্টারফেস। Google Maps Platform পরিষেবার শর্তাবলীতে লাইসেন্স সংক্রান্ত বিধিনিষেধ অনুযায়ী, এই পরিষেবাগুলি ম্যাপের সাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে।
Maps API ওয়েব পরিষেবা নির্দিষ্ট URL-এ HTTP(S) অনুরোধ ব্যবহার করে, URL প্যারামিটার এবং/অথবা JSON-ফর্ম্যাট POST ডেটা পরিষেবায় আর্গুমেন্ট হিসেবে পাস করে। সাধারণত, এই পরিষেবাগুলি আপনার অ্যাপ্লিকেশনের মাধ্যমে পার্সিং এবং/অথবা প্রসেসিংয়ের জন্য JSON বা XML হিসাবে রেসপন্স বডিতে ডেটা ফেরত দেয়।
সাধারণত Time Zone API-এর অনুরোধ নিচের ফর্ম্যাটে করা হয়:
https://maps.googleapis.com/maps/api/timezone/output?parameters
যেখানে output উত্তরের ফর্ম্যাট (সাধারণত
json বা xml) নির্দেশ করে।
মনে রাখবেন: টাইম জোন API-এর সব অ্যাপ্লিকেশনের ক্ষেত্রে যাচাইকরণ প্রয়োজন। যাচাইকরণ সংক্রান্ত ক্রেডেনশিয়াল সম্পর্কে আরও তথ্য পান।
SSL/TLS অ্যাক্সেস
API কী ব্যবহার করে বা ব্যবহারকারীর ডেটা আছে এমন সব Google Maps Platform অনুরোধের জন্য HTTPS প্রোটোকল প্রয়োজন। HTTP-এর মাধ্যমে করা অনুরোধে সংবেদনশীল ডেটা থাকলে তা বাতিল করা হতে পারে।
সঠিক URL তৈরি করা
আপনি ভাবতে পারেন যে "সঠিক" URL কী তা সহজেই বোঝা যায়, কিন্তু
ব্যাপারটা ঠিক তা নয়। যেমন, ব্রাউজারের অ্যাড্রেস বারে লেখা URL-এ বিশেষ অক্ষর (যেমন, "上海+中國") থাকতে পারে; ট্রান্সমিশনের আগে ব্রাউজারকে ইন্টার্নালি
এইসব অক্ষর অন্য এনকোডিংয়ে অনুবাদ করতে হয়।
একইভাবে, UTF-8 ইনপুট
জেনারেট বা গ্রহণ করে এমন যেকোনও কোড UTF-8 অক্ষর সহ URL-কে "সঠিক" হিসেবে বিবেচনা করতে পারে, কিন্তু ওয়েব সার্ভারে পাঠানোর আগে সেইসব অক্ষরকে
ট্রান্সলেট করতে হবে।
এই প্রক্রিয়াকে
URL-এনকোডিং বা শতাংশ-এনকোডিং বলা হয়।
বিশেষ অক্ষর
আমাদের বিশেষ অক্ষরগুলি অনুবাদ করতে হবে কারণ সব URL-কে ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (URI) স্পেসিফিকেশন দ্বারা নির্দিষ্ট সিনট্যাক্স মেনে চলতে হবে। এর অর্থ হল, URL-এ শুধুমাত্র ASCII অক্ষরের বিশেষ সাবসেট থাকতে হবে: পরিচিত অ্যালফানিউমেরিক চিহ্ন এবং URL-এর মধ্যে কন্ট্রোল অক্ষর হিসেবে ব্যবহার করার জন্য কিছু সংরক্ষিত অক্ষর। এই সারণীতে এইসব অক্ষরের সারসংক্ষেপ দেওয়া হল:
| সেট করুন | অক্ষর | URL ব্যবহার |
|---|---|---|
| বর্ণসাংখ্যিক | ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ড় ঢ় য় ং ঃ ঁ অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ড় ঢ় য় ং ঃ ঁ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ | টেক্সট স্ট্রিং, স্কিম ব্যবহার (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-এর অনিচ্ছাকৃত অপব্যবহারের কারণে আপনার অ্যাপ্লিকেশন ব্লক হওয়া এড়াতে পারবেন।
এক্সপোনেনশিয়াল ব্যাকঅফ
খুব কম ক্ষেত্রে, আপনার অনুরোধ পূরণ করার সময় কোনও সমস্যা হতে পারে; আপনি 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 সম্পর্কে কিছু জ্ঞান থাকলে, একটি শক্তিশালী পার্সিং স্কিম ডেভেলপ করার ক্ষেত্রে অনেক সুবিধা হয়। এই বিভাগে, XML ডকুমেন্টের মধ্যে থাকা এলিমেন্টকে কীভাবে XPath-এর মাধ্যমে অ্যাড্রেস করা হয়, সেই বিষয়ে ফোকাস করা হবে। এর ফলে আপনি একাধিক এলিমেন্টকে অ্যাড্রেস করতে এবং জটিল কোয়েরি তৈরি করতে পারবেন।
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" এক্সপ্রেশনটি<WebServiceResponse>নোডের চাইল্ড হিসেবে থাকা সব<result>নোড বেছে নেয়। (মনে রাখবেন, এই দুটি এলিমেন্টই মূল নোড "/" থেকে এসেছে।) - বর্তমান প্রসঙ্গ থেকে আপেক্ষিক পাথ: এক্সপ্রেশন
"
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>
|
name যার type টেক্সট হল "sample"।
result |
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 মূল্যায়ন করা
javax.xml.xpath.* প্যাকেজের মধ্যে XML পার্স করা এবং XPath এক্সপ্রেশন ব্যবহার করার জন্য Java-তে ব্যাপক সহায়তা
উপলভ্য।
সেই কারণে, এই বিভাগে স্যাম্পেল কোড 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"); } } }