টাইম জোন API ওয়েব পরিষেবাগুলি ব্যবহার করে সর্বোত্তম অনুশীলন৷

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

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

একটি ওয়েব সেবা কি?

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

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

একটি সাধারণ টাইম জোন API অনুরোধ সাধারণত নিম্নলিখিত ফর্মের হয়:

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

যেখানে output প্রতিক্রিয়া বিন্যাস নির্দেশ করে (সাধারণত json বা xml )।

দ্রষ্টব্য : সমস্ত সময় অঞ্চল API অ্যাপ্লিকেশনের প্রমাণীকরণ প্রয়োজন। প্রমাণীকরণ শংসাপত্র সম্পর্কে আরও তথ্য পান।

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

API কী ব্যবহার করে বা ব্যবহারকারীর ডেটা ধারণ করে এমন সমস্ত Google মানচিত্র প্ল্যাটফর্ম অনুরোধের জন্য HTTPS প্রয়োজন। সংবেদনশীল ডেটা ধারণ করে HTTP-এর মাধ্যমে করা অনুরোধ প্রত্যাখ্যান করা হতে পারে।

একটি বৈধ URL তৈরি করা

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

বিশেষ অক্ষর

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

বৈধ URL অক্ষরের সারাংশ
সেট চরিত্র ইউআরএল ব্যবহার
আলফানিউমেরিক abcdefghijklm nopqrstuvwxyz ABCDEFGHIJKLM NOPQRSTUVWXYZ 0 1 2 3 4 5 6 7 8 9 টেক্সট স্ট্রিং, স্কিম ব্যবহার ( http ), পোর্ট ( 8080 ), ইত্যাদি।
অসংরক্ষিত - _ ~ টেক্সট স্ট্রিং
সংরক্ষিত ! *' (); : @ & = + $ , / ? % # [ ] অক্ষর এবং/অথবা টেক্সট স্ট্রিং নিয়ন্ত্রণ করুন

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

  • আপনি যে অক্ষরগুলি পরিচালনা করতে চান সেগুলি উপরের সেটের বাইরে বিদ্যমান। উদাহরণস্বরূপ,上海+中國মতো বিদেশী ভাষার অক্ষরগুলিকে উপরের অক্ষরগুলি ব্যবহার করে এনকোড করা প্রয়োজন৷ জনপ্রিয় নিয়ম অনুসারে, স্পেসগুলি (যা ইউআরএল-এর মধ্যে অনুমোদিত নয়) প্রায়শই প্লাস '+' অক্ষর ব্যবহার করে উপস্থাপন করা হয়।
  • সংরক্ষিত অক্ষর হিসাবে উপরের সেটের মধ্যে অক্ষর বিদ্যমান, কিন্তু আক্ষরিকভাবে ব্যবহার করা প্রয়োজন। উদাহরণ স্বরূপ, ? ক্যোয়ারী স্ট্রিং এর শুরু নির্দেশ করতে URL-এর মধ্যে ব্যবহার করা হয়; আপনি যদি স্ট্রিং "? এবং The Mysterions" ব্যবহার করতে চান, তাহলে আপনাকে '?' এনকোড করতে হবে চরিত্র

ইউআরএল-এনকোড করা সমস্ত অক্ষর একটি '%' অক্ষর এবং তাদের UTF-8 অক্ষরের সাথে সম্পর্কিত একটি দুই-অক্ষরের হেক্স মান ব্যবহার করে এনকোড করা হয়েছে। উদাহরণস্বরূপ, UTF-8-এ上海+中國%E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B URL-এনকোড করা হবে। স্ট্রিং ? and the Mysterians %3F+and+the+Mysterians বা %3F%20and%20the%20Mysterians হিসাবে ইউআরএল-এনকোড করা হবে।

এনকোডিং প্রয়োজন এমন সাধারণ অক্ষর

কিছু সাধারণ অক্ষর যা এনকোড করা আবশ্যক:

অনিরাপদ চরিত্র এনকোড করা মান
স্থান %20
" %22
< %3C
> %3E
# %23
% %25
| %7C

আপনি ব্যবহারকারীর ইনপুট থেকে প্রাপ্ত একটি URL রূপান্তর কখনও কখনও চতুর হয়. উদাহরণস্বরূপ, একজন ব্যবহারকারী "5ম এবং প্রধান সেন্ট" হিসাবে একটি ঠিকানা লিখতে পারেন। সাধারণত, আপনার ইউআরএল এর অংশগুলি থেকে তৈরি করা উচিত, যেকোনো ব্যবহারকারীর ইনপুটকে আক্ষরিক অক্ষর হিসাবে বিবেচনা করা উচিত।

উপরন্তু, সমস্ত Google মানচিত্র প্ল্যাটফর্ম ওয়েব পরিষেবা এবং স্ট্যাটিক ওয়েব API-এর জন্য URLগুলি 16384 অক্ষরের মধ্যে সীমাবদ্ধ৷ বেশিরভাগ পরিষেবার জন্য, এই অক্ষর সীমা খুব কমই ব্যবহার করা হবে। যাইহোক, মনে রাখবেন যে কিছু নির্দিষ্ট পরিষেবার বেশ কয়েকটি প্যারামিটার থাকে যার ফলে দীর্ঘ URL হতে পারে।

Google API-এর ভদ্র ব্যবহার

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

সূচকীয় ব্যাকঅফ

বিরল ক্ষেত্রে আপনার অনুরোধ পরিবেশন করতে কিছু ভুল হতে পারে; আপনি একটি 4XX বা 5XX HTTP প্রতিক্রিয়া কোড পেতে পারেন, অথবা TCP সংযোগটি আপনার ক্লায়েন্ট এবং Google এর সার্ভারের মধ্যে কোথাও ব্যর্থ হতে পারে৷ প্রায়শই অনুরোধটি পুনরায় চেষ্টা করা সার্থক কারণ মূল ব্যর্থ হলে ফলোআপ অনুরোধ সফল হতে পারে। যাইহোক, Google-এর সার্ভারে বারবার অনুরোধ করা সহজভাবে লুপ না করা গুরুত্বপূর্ণ। এই লুপিং আচরণ আপনার ক্লায়েন্ট এবং Google এর মধ্যে নেটওয়ার্ককে ওভারলোড করতে পারে যা অনেক পক্ষের জন্য সমস্যা সৃষ্টি করে।

একটি ভাল পদ্ধতি হল প্রচেষ্টার মধ্যে ক্রমবর্ধমান বিলম্বের সাথে পুনরায় চেষ্টা করা। সাধারণত বিলম্ব প্রতিটি প্রচেষ্টার সাথে একটি গুণক ফ্যাক্টর দ্বারা বৃদ্ধি করা হয়, একটি পদ্ধতি যা এক্সপোনেনশিয়াল ব্যাকঅফ নামে পরিচিত।

উদাহরণস্বরূপ, এমন একটি অ্যাপ্লিকেশন বিবেচনা করুন যা টাইম জোন এপিআইতে এই অনুরোধ করতে চায়:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&key=YOUR_API_KEY

নিম্নলিখিত পাইথন উদাহরণটি দেখায় কিভাবে সূচকীয় ব্যাকঅফের সাথে অনুরোধ করা যায়:

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-এর এপিআই-এ বিপুল সংখ্যক সিঙ্ক্রোনাইজ করা অনুরোধগুলি Google-এর পরিকাঠামোতে ডিস্ট্রিবিউটেড ডিনায়েল অফ সার্ভিস (DDoS) আক্রমণের মতো দেখতে পারে এবং সেই অনুযায়ী আচরণ করা হবে। এটি এড়াতে, আপনাকে নিশ্চিত করতে হবে যে API অনুরোধগুলি ক্লায়েন্টদের মধ্যে সিঙ্ক্রোনাইজ করা হয়নি।

উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন বিবেচনা করুন যা বর্তমান সময় অঞ্চলে সময় প্রদর্শন করে। এই অ্যাপ্লিকেশনটি সম্ভবত ক্লায়েন্ট অপারেটিং সিস্টেমে একটি অ্যালার্ম সেট করবে যা মিনিটের শুরুতে এটিকে জাগিয়ে দেবে যাতে প্রদর্শিত সময় আপডেট করা যায়। সেই অ্যালার্মের সাথে যুক্ত প্রক্রিয়াকরণের অংশ হিসাবে অ্যাপ্লিকেশনটির কোনো API কল করা উচিত নয়

একটি নির্দিষ্ট অ্যালার্মের প্রতিক্রিয়া হিসাবে API কল করা খারাপ কারণ এর ফলে API কলগুলি সময়ের সাথে সমানভাবে বিতরণ না করে এমনকি বিভিন্ন ডিভাইসের মধ্যেও মিনিটের শুরুতে সিঙ্ক্রোনাইজ করা হয়। এটি করার একটি খারাপভাবে ডিজাইন করা অ্যাপ্লিকেশন প্রতিটি মিনিটের শুরুতে স্বাভাবিক মাত্রার ষাট গুণে ট্রাফিকের একটি স্পাইক তৈরি করবে।

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

মিনিটের শুরুর পাশাপাশি, অন্যান্য সাধারণ সিঙ্ক্রোনাইজেশন সময়গুলিকে লক্ষ্য করা উচিত নয় যাতে লক্ষ্য করা যায় এক ঘন্টার শুরুতে, এবং প্রতিটি দিনের শুরু মধ্যরাতে।

প্রতিক্রিয়া প্রক্রিয়াকরণ

এই বিভাগে আলোচনা করা হয়েছে কিভাবে ওয়েব পরিষেবার প্রতিক্রিয়াগুলি থেকে গতিশীলভাবে এই মানগুলি বের করা যায়।

Google মানচিত্র ওয়েব পরিষেবাগুলি এমন প্রতিক্রিয়াগুলি প্রদান করে যা বোঝা সহজ, কিন্তু ঠিক ব্যবহারকারী বান্ধব নয়৷ একটি কোয়েরি সম্পাদন করার সময়, ডেটার একটি সেট প্রদর্শন করার পরিবর্তে, আপনি সম্ভবত কয়েকটি নির্দিষ্ট মান বের করতে চান। সাধারণত, আপনি ওয়েব পরিষেবা থেকে প্রতিক্রিয়া বিশ্লেষণ করতে চান এবং শুধুমাত্র সেই মানগুলি বের করতে চান যা আপনার আগ্রহের।

আপনি যে পার্সিং স্কিমটি ব্যবহার করেন তা নির্ভর করে আপনি XML বা JSON-এ আউটপুট ফেরত দিচ্ছেন কিনা তার উপর। JSON প্রতিক্রিয়া, ইতিমধ্যে জাভাস্ক্রিপ্ট অবজেক্টের আকারে, ক্লায়েন্টে জাভাস্ক্রিপ্টের মধ্যেই প্রক্রিয়া করা হতে পারে। XML প্রতিক্রিয়াগুলি XML ফর্ম্যাটের মধ্যে উপাদানগুলিকে সম্বোধন করার জন্য একটি XML প্রসেসর এবং একটি XML ক্যোয়ারী ভাষা ব্যবহার করে প্রক্রিয়া করা উচিত। আমরা নিম্নলিখিত উদাহরণগুলিতে XPath ব্যবহার করি, কারণ এটি সাধারণত XML প্রক্রিয়াকরণ লাইব্রেরিতে সমর্থিত।

XPath সহ XML প্রক্রিয়া করা হচ্ছে

XML হল একটি অপেক্ষাকৃত পরিপক্ক কাঠামোগত তথ্য বিন্যাস যা ডেটা বিনিময়ের জন্য ব্যবহৃত হয়। যদিও এটি JSON এর মতো হালকা নয়, XML আরও ভাষা সমর্থন এবং আরও শক্তিশালী সরঞ্জাম সরবরাহ করে। জাভাতে 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 সব <lat> উপাদানের সাথে মিলবে যেগুলি <viewport> অভিভাবক হিসাবে ট্রেস করতে পারে।

ডিফল্টরূপে, XPath এক্সপ্রেশন সমস্ত উপাদানের সাথে মেলে। আপনি বর্গাকার বন্ধনী ( [] ) এ আবদ্ধ একটি predicate প্রদান করে একটি নির্দিষ্ট উপাদানের সাথে মিল করার জন্য অভিব্যক্তিকে সীমাবদ্ধ করতে পারেন। 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>
    
Predicate সঙ্গে পাথ
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 মানচিত্র ওয়েব পরিষেবাগুলি বৈশিষ্ট্যগুলি ছাড়াই উপাদানগুলি পরিবেশন করে, তাই বৈশিষ্ট্যগুলির মিলের প্রয়োজন নেই৷

অভিব্যক্তিতে পাঠ্য নির্বাচন

একটি 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 স্পেসিফিকেশন দেখুন।

জাভাতে XPath মূল্যায়ন করা হচ্ছে

জাভা XML পার্সিং এবং javax.xml.xpath.* প্যাকেজের মধ্যে XPath এক্সপ্রেশন ব্যবহার করার জন্য ব্যাপক সমর্থন রয়েছে। সেই কারণে, এই বিভাগে নমুনা কোডটি জাভা ব্যবহার করে ব্যাখ্যা করে যে কীভাবে XML পরিচালনা করা যায় এবং XML পরিষেবার প্রতিক্রিয়াগুলি থেকে ডেটা পার্স করা যায়।

আপনার জাভা কোডে XPath ব্যবহার করার জন্য, আপনাকে প্রথমে একটি XPathFactory এর একটি উদাহরণ তৈরি করতে হবে এবং একটি XPath অবজেক্ট তৈরি করতে সেই ফ্যাক্টরিতে newXPath() কল করতে হবে। এই বস্তুটি তারপর evaluate() পদ্ধতি ব্যবহার করে পাস করা XML এবং XPath এক্সপ্রেশনগুলিকে প্রক্রিয়া করতে পারে।

XPath এক্সপ্রেশন মূল্যায়ন করার সময়, নিশ্চিত করুন যে আপনি যে কোনও সম্ভাব্য "নোড সেট" এর উপর পুনরাবৃত্তি করেছেন যা ফেরত দেওয়া হতে পারে। যেহেতু এই ফলাফলগুলি জাভা কোডে 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");
    }
  }
}