Places API ওয়েব পরিষেবা ব্যবহার করার পেশাদার পদ্ধতি

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

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

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

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

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

সাধারণত Places API-এর অনুরোধ নিম্নলিখিত ফর্মের হয়:

https://places.googleapis.com/v1/places/PLACE_ID?parameters

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

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

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

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

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

বিশেষ অক্ষর

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

সঠিক 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-এর অনিচ্ছাকৃত অপব্যবহারের কারণে আপনার অ্যাপ্লিকেশন ব্লক হওয়া এড়াতে পারবেন।

এক্সপোনেনশিয়াল ব্যাকঅফ

বিরল ক্ষেত্রে আপনার অনুরোধ পূরণ করার সময় কোনও সমস্যা হতে পারে; আপনি 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 উত্তরগুলি যেহেতু আগে থেকেই জাভাস্ক্রিপ্ট অবজেক্টের আকারে থাকে, তাই সেগুলি ক্লায়েন্টে জাভাস্ক্রিপ্টের মধ্যেই প্রসেস করা যেতে পারে। 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>
    
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");
    }
  }
}