Directions API (পুরনো) ওয়েব পরিষেবা ব্যবহার করার পেশাদার পদ্ধতি

Google Maps Platform ওয়েব পরিষেবা হল Google পরিষেবার HTTP ইন্টারফেসের একটি সংগ্রহ যা আপনার ম্যাপ অ্যাপ্লিকেশনের জন্য ভৌগোলিক ডেটা প্রদান করে।

এই নির্দেশিকায় আপনার ওয়েব পরিষেবা অনুরোধ সেট-আপ করা এবং পরিষেবার উত্তর প্রসেস করার জন্য উপযোগী কিছু সাধারণ পদ্ধতি বর্ণনা করা হয়েছে। Directions API (Legacy)-এর সম্পূর্ণ ডকুমেন্টেশনের জন্য ডেভেলপার গাইড দেখুন।

ওয়েব পরিষেবা কী?

Google Maps Platform ওয়েব পরিষেবা হল এক্সটার্নাল পরিষেবা থেকে Maps API ডেটার অনুরোধ করা এবং আপনার Maps অ্যাপ্লিকেশনের মধ্যে ডেটা ব্যবহার করার জন্য একটি ইন্টারফেস। এইসব পরিষেবা Google Maps Platform পরিষেবার শর্তাবলীতে উল্লিখিত লাইসেন্স সংক্রান্ত বিধিনিষেধ অনুযায়ী ম্যাপের সাথে একসাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে।

Maps API ওয়েব পরিষেবা নির্দিষ্ট URL-এ HTTP(S) অনুরোধ ব্যবহার করে, URL প্যারামিটার এবং/অথবা JSON-ফরম্যাট POST ডেটা পরিষেবার আর্গুমেন্ট হিসেবে পাস করে। সাধারণত, এই পরিষেবাগুলি আপনার অ্যাপ্লিকেশনের মাধ্যমে পার্সিং এবং/অথবা প্রসেসিংয়ের জন্য JSON বা XML হিসাবে রেসপন্স বডিতে ডেটা ফেরত দেয়।

সাধারণত Directions API (Legacy) অনুরোধের ফর্ম নিম্নলিখিত ধরনের হয়:

https://maps.googleapis.com/maps/api/directions/output?parameters

যেখানে output উত্তরের ফর্ম্যাট (সাধারণত json বা xml) নির্দেশ করে।

মনে রাখবেন: সব Directions API (Legacy) অ্যাপ্লিকেশনের জন্য যাচাইকরণ প্রয়োজন। যাচাইকরণ সংক্রান্ত ক্রেডেনশিয়াল সম্পর্কে আরও তথ্য পান।

SSL/TLS অ্যাক্সেস

API কী ব্যবহার করে বা ব্যবহারকারীর ডেটা আছে এমন সব Google Maps Platform অনুরোধের জন্য HTTPS প্রয়োজন। HTTP-এর মাধ্যমে করা অনুরোধে সংবেদনশীল ডেটা থাকলে তা বাতিল করা হতে পারে।

সঠিক URL তৈরি করা

আপনি ভাবতে পারেন যে "সঠিক" URL কী তা সহজেই বোঝা যায়, কিন্তু ব্যাপারটা ঠিক তা নয়। যেমন, ব্রাউজারের অ্যাড্রেস বারে লেখা URL-এ বিশেষ অক্ষর (যেমন, "上海+中國") থাকতে পারে; ট্রান্সমিশনের আগে ব্রাউজারকে ইন্টার্নালি এইসব অক্ষর অন্য এনকোডিংয়ে অনুবাদ করতে হয়। একইভাবে, UTF-8 ইনপুট তৈরি বা গ্রহণ করে এমন যেকোনও কোড UTF-8 অক্ষর সহ URL-কে "সঠিক" হিসেবে বিবেচনা করতে পারে, তবে সেগুলি কোনও ওয়েব সার্ভারে পাঠানোর আগে সেই অক্ষরগুলি অনুবাদ করতে হবে। এই প্রসেসকে URL-এনকোডিং বা পার্সেন্ট-এনকোডিং বলা হয়।

বিশেষ অক্ষর

আমাদের বিশেষ অক্ষরগুলি অনুবাদ করতে হবে কারণ সব URL-কে ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (URI) স্পেসিফিকেশন দ্বারা নির্দিষ্ট সিনট্যাক্স মেনে চলতে হবে। এর অর্থ হল, URL-এ অবশ্যই ASCII অক্ষরের একটি বিশেষ সাবসেট থাকতে হবে: পরিচিত বর্ণসংখ্যাসূচক চিহ্ন এবং URL-এর মধ্যে কন্ট্রোল অক্ষর হিসেবে ব্যবহারের জন্য কিছু সংরক্ষিত অক্ষর। এই সারণীতে এইসব অক্ষরের সংক্ষিপ্তসার দেওয়া হল:

সঠিক 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&timestamp=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 রেসপন্স, আগে থেকেই Javascript অবজেক্টের ফর্মে থাকার কারণে, ক্লায়েন্টের Javascript-এর মধ্যেই প্রসেস করা যেতে পারে। 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" এক্সপ্রেশনটি <result> নোডের চাইল্ড নোড হিসেবে থাকা <WebServiceResponse> নোডের সবকটি নোড বেছে নেয়। (মনে রাখবেন যে এই দুটি এলিমেন্টই রুট নোড "/" থেকে নেমে এসেছে।)
  • বর্তমান প্রসঙ্গ থেকে রিলেটিভ পাথ: "result" এক্সপ্রেশনটি বর্তমান প্রসঙ্গের মধ্যে যেকোনও <result> এলিমেন্টের সাথে ম্যাচ করবে। সাধারণত, আপনাকে প্রসঙ্গ নিয়ে চিন্তা করতে হবে না, কারণ আপনি সাধারণত একটি এক্সপ্রেশনের মাধ্যমে ওয়েব পরিষেবা ফলাফল প্রসেস করছেন।

এই এক্সপ্রেশনগুলির যেকোনও একটি ওয়াইল্ডকার্ড পাথ যোগ করার মাধ্যমে বৃদ্ধি করা যেতে পারে, যা ডবল-স্ল্যাশ ("//") দিয়ে দেখানো হয়। এই ওয়াইল্ডকার্ড দেখায় যে মধ্যবর্তী পাথে শূন্য বা তার বেশি এলিমেন্ট মিলতে পারে। XPath এক্সপ্রেশন "//formatted_address," যেমন, বর্তমান ডকুমেন্টে সেই নামের সব নোডের সাথে ম্যাচ করবে। //viewport//lat এক্সপ্রেশনটি সেইসব <lat> এলিমেন্টের সাথে ম্যাচ করবে যেগুলি <viewport>-কে পেরেন্ট হিসেবে ট্রেস করতে পারে।

ডিফল্ট হিসেবে, 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 মূল্যায়ন করা

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");
    }
  }
}