XPath পরীক্ষক
XML-এর বিপরীতে XPath এক্সপ্রেশন পরীক্ষা করুন এবং সব মিলে যাওয়া নোড দেখুন
XML ইনপুট
XPath কী?
XPath (XML Path Language) হলো একটি কুয়েরি ভাষা যা XML ডকুমেন্ট থেকে নোড নির্বাচনের জন্য ব্যবহৃত হয়। XSLT স্ট্যান্ডার্ডের অংশ হিসেবে W3C-এর তৈরি করা, XPath একটি XML ডকুমেন্টকে নোডের গাছ হিসেবে বিবেচনা করে এবং সেই গাছে নেভিগেট করার জন্য পথ-ভিত্তিক সিনট্যাক্স প্রদান করে। //book[@category="fiction"]/title-এর মতো একটি XPath এক্সপ্রেশন প্রতিটি book উপাদানের ভেতরে থাকা title উপাদান নির্বাচন করে যার category অ্যাট্রিবিউটের মান "fiction"। XPath 1.0, যে সংস্করণটি সব প্রধান ব্রাউজার এবং অধিকাংশ XML লাইব্রেরি সমর্থন করে, ১৯৯৯ সালে W3C Recommendation হিসেবে প্রকাশিত হয় এবং এটি এখনও সর্বাধিক ব্যবহৃত সংস্করণ।
XPath এক্সপ্রেশন চারটি ফলাফল প্রকারের মধ্যে একটি প্রদান করে: নোড সেট, স্ট্রিং, সংখ্যা বা বুলিয়ান। নোড সেট সবচেয়ে সাধারণ ফলাফল এবং এতে শূন্য বা একাধিক XML নোড থাকে (উপাদান, অ্যাট্রিবিউট, টেক্সট নোড, মন্তব্য বা প্রক্রিয়াকরণ নির্দেশনা)। স্ট্রিং, সংখ্যা এবং বুলিয়ান ফলাফল আসে XPath ফাংশন যেমন count(), sum(), contains(), এবং বুলিয়ান তুলনা থেকে। এই কারণেই XPath তথ্য বের করা এবং XSLT স্টাইলশিট ও XML Schema অ্যাসার্শনে শর্তযুক্ত লজিক লেখা — উভয় কাজের জন্যই উপযুক্ত।
Version 1.0 এক্সপ্রেশন সর্বত্র কাজ করে: JavaScript-এর document.evaluate(), Python-এর lxml ও ElementTree, Java-র javax.xml.xpath, PHP-এর DOMXPath, এবং xmllint-এর মতো কমান্ড-লাইন টুলে। Version 2.0 এবং 3.1 আরও শক্তিশালী টাইপ সিস্টেম এবং ফাংশন যোগ করে কিন্তু Saxon-এর মতো নির্দিষ্ট ইঞ্জিন প্রয়োজন। ডিফল্ট হিসেবে Version 1.0 ব্যবহার করুন। শুধুমাত্র তখনই 2.0 বা 3.1-এ যান যখন আপনার সিকোয়েন্স, রেগুলার এক্সপ্রেশন বা উচ্চ-ক্রমের ফাংশন প্রয়োজন — এবং Saxon বা BaseX-এর উপর নির্ভরতা গ্রহণ করুন।
অনলাইন XPath পরীক্ষক কেন ব্যবহার করবেন?
সঠিক এক্সপ্রেশন লিখতে ডকুমেন্টের কাঠামো বোঝা এবং আসল তথ্যের বিপরীতে পরীক্ষা করা প্রয়োজন। এই টুলটি আপনাকে একটি ইন্টারঅ্যাক্টিভ পরিবেশ দেয় যেখানে প্রজেক্ট সেটআপ বা বয়লারপ্লেট কোড না লিখেই এক্সপ্রেশন বারবার বদলে চেষ্টা করা যায়।
XPath পরীক্ষকের ব্যবহারের ক্ষেত্র
XPath অক্ষের রেফারেন্স
একটি অক্ষ বর্তমান (প্রসঙ্গ) নোডের সাপেক্ষে নেভিগেশনের দিক নির্ধারণ করে। পূর্ণ সিনট্যাক্স হলো axis::node-test[predicate], যদিও অধিকাংশ ডেভেলপার প্রতিদিন সংক্ষিপ্ত রূপ (//, @, ..) ব্যবহার করেন। এই সারণিতে ব্যবহারিক উদাহরণসহ সব 1.0 অক্ষ তালিকাভুক্ত করা হয়েছে।
| অক্ষ | উদাহরণ | বিবরণ |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-or-self::* | Current node plus all ancestors |
XPath 1.0 ফাংশন
ভাষাটি চারটি বিভাগে ২৭টি অন্তর্নির্মিত ফাংশন সংজ্ঞায়িত করে: নোড সেট, স্ট্রিং, সংখ্যা এবং বুলিয়ান। কুয়েরি লেখার সময় আপনি সবচেয়ে বেশি এই ফাংশনগুলো ব্যবহার করবেন। সবগুলোই এই টুলে এবং সব compliant implementation-এ কাজ করে।
| ফাংশন | বিভাগ | বিবরণ |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") — substring match |
| starts-with() | String | starts-with(title, "The") — prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) — totals numeric values |
| not() | Boolean | not(@disabled) — negation |
| name() | String | Returns element or attribute name |
কোড উদাহরণ
এই উদাহরণগুলো দেখায় কিভাবে প্রোগ্রামগতভাবে এক্সপ্রেশন মূল্যায়ন করতে হয়। প্রতিটি স্নিপেট একই catalog.xml কাঠামো ব্যবহার করে যাতে আপনি বিভিন্ন ভাষায় API পার্থক্য তুলনা করতে পারেন।
const xml = `<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
console.log(node.textContent) // → "1984", "Dune"
node = result.iterateNext()
}
// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98from lxml import etree
xml = """<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""
tree = etree.fromstring(xml.encode())
# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books) # → ['1984']
# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first) # → ['1984']
# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap) # → Trueimport javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;
var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));
var xpath = XPathFactory.newInstance().newXPath();
// Select node set
NodeList titles = (NodeList) xpath.evaluate(
"//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
// → "1984", "Dune"
}
// Evaluate to number
double total = (double) xpath.evaluate(
"sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98# Select all book titles xmllint --xpath '//book/title/text()' catalog.xml # → 1984Dune # Select by attribute xmllint --xpath '//book[@id="2"]/title' catalog.xml # → <title>Dune</title> # Count nodes xmllint --xpath 'count(//book)' catalog.xml # → 2 # Using xmlstarlet for formatted output xmlstarlet sel -t -v '//book/title' -n catalog.xml # → 1984 # → Dune