Thứ Hai, 29 tháng 8, 2016

Xquery – Giới thiệu các khái niệm về Xquery, cú pháp và cách sử dụng Xquery, và API - SAXON để sử dụng Xquery trong ứng dụng thực tế

Xquery – Giới thiệu các khái niệm về Xquery, cú pháp và cách sử dụng Xquery, và API - SAXON để sử dụng Xquery trong ứng dụng thực tế

Mục đích: Chủ đề của bài này giới thiệu Xquery và một số cú pháp cơ bản, một thành phần hỗ trợ giúp để ứng dụng vào XML kết hợp XPath để truy vấn dữ liệu và tạo ra kết xuất theo định dạng yêu cầu trong quá trình xử lý. Chúng tôi sẽ mô tả nội dung cú pháp với những nội dung đơn giản nhất trong chủ đề này cùng với cách sử dụng song song được thể hiện qua các ví dụ để quí vị có thể tiếp cận ý niệm mới một cách dễ dàng. Nội dung bài này sẽ là nền tảng để tiếp cận chủ đề xây dựng ứng dụng web với việc sử dụng XML là dữ liệu và sử dụng Xquery để truy vấn và kết xuất dữ liệu. Trong chủ đề này, chúng tôi cũng sẽ giới thiệu API - SAXON kết hợp với Xquery để có thể áp dụng Xquery trong các ứng dụng của java application hay J2EE/JavaEE

Xquery – Giới thiệu các khái niệm về Xquery, cú pháp và cách sử dụng Xquery, và API để sử dụng Xquery trong ứng dụng thực tế

Mục đích: Chủ đề của bài này giới thiệu Xquery và một số cú pháp cơ bản, một thành phần hỗ trợ giúp để ứng dụng vào XML kết hợp XPath để truy vấn dữ liệu và tạo ra kết xuất theo định dạng yêu cầu trong quá trình xử lý. Chúng tôi sẽ mô tả nội dung cú pháp với những nội dung đơn giản nhất trong chủ đề này cùng với cách sử dụng song song được thể hiện qua các ví dụ để quí vị có thể tiếp cận ý niệm mới một cách dễ dàng. Nội dung bài này sẽ là nền tảng để tiếp cận chủ đề xây dựng ứng dụng web với việc sử dụng XML là dữ liệu và sử dụng Xquery để truy vấn và kết xuất dữ liệu. Trong chủ đề này, chúng tôi cũng sẽ giới thiệu API - SAXON kết hợp với Xquery để có thể áp dụng Xquery trong các ứng dụng của java application hay J2EE/JavaEE

Yêu cầu về kiến thức cơ bản

  • Nắm vững các khái niệm về XML và cách viết tài liệu XML well-formed (tham khảo lại bài Giới thiệu về XML – định nghĩa, cách viết XML đúng cú pháp (XML well-formed) http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-xml-inh-nghia-cach-viet.html )
  • Nắm vững các khái niệm về namespace và cách sử dụng namespace trong tài liệu XML (tham khảo lại bài Sử dụng XML với namespace – Sử dụng kết hợp những tài liệu XML với nhau từ nhiều người định nghĩa khác nhau http://www.kieutrongkhanh.net/2016/08/su-dung-xml-voi-namespace-su-dung-ket.html )
  • Nắm vững khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng, sử dụng các method hay function
  • Nắm vững khái niệm về cách sử dụng XPath (tham khảo lại bài Giới thiệu về XPath http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-xpath.html )
  • Nắm vững khái niệm về việc kiểm tra tài liệu XML Validate (tham khảo lại bài Khai báo Element – Tag và Attributes. Sử dụng DTD để kiểm tra tài liệu XML được viết đúng theo đúng định dạng dùng để truy xuất và giao tiếp (validation) http://www.kieutrongkhanh.net/2016/08/khai-bao-element-tag-va-attributes-su.html . Và bài Giới thiệu về XML Schema – định nghĩa, cách viết XML Schema, áp dụng XML Schema cho validation nội dung của tài liệu XML http://www.kieutrongkhanh.net/2016/08/gioi-thieu-ve-xml-schema-inh-nghia-cach.html )
  • Đã viết và kiểm tra một tài liệu XML well-formed, validated.
  • Nắm vững và đã sử dụng tốt cách truy vấn sử dụng XPath
  • Đã sử dụng một số bộ parser API, framework JAXB (chúng tôi sẽ giới thiệu các nội dung này kỹ hơn trong các chủ đề khác),
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22

Tổng quan XQuery

·         Xquery là ngôn ngữ dựa trên XPath để tìm kiếm và tương tác trên bất kỳ dữ liệu nào được tổ chức trên bộ nhớ dưới dạng hình cây

·         XQuery có khả năng truy xuất nhiều tài liệu XML hay nhiều DB cùng một lúc (đặc điểm nổi bật hơn XPath) để trích xuất dữ liệu theo đúng yêu cầu định dạng

·         Xquery không có context mặc định như XPath

  • Ví dụ

XQuery: doc(“dictionary.xml”)/dictionary/entry[6]

XPath: /dictionary/entry[6]

    • Trong ví dụ trên, chúng ta thấy biểu thức Xpath không cần chỉ định tài liệu truy vấn vì mặc định Xpath chỉ truy vấn trên duy nhất một tài liệu và bộ xử lý Xpath đang mapping trên duy nhất tài liệu hay cấu trúc cây mà nó đang thực hiện truy vấn
    • Trong khi, Xquery phải xác định rõ nội document vì cùng một lúc nó có thể truy xuất nhiều document hay nhiều DB. Do vậy, nguồn truy vấn phải được xác định rõ ràng, cụ thể trong ví dụ trên là tài liệu dictionary.xml
  • Câu lệnh FLWOR
    • Tương tự như câu lệnh truy vấn Select trong SQL
    • Nó bao gồm các từ khóa For, Let, Where, Order by, Return
    • Mỗi câu lệnh FLWOR phải luôn bắt đầu với mệnh đề for hay mệnh đề let (hay có thể là cả hai)
    • Các câu lệnh FLWOR có thể được Xquery xử lý song song
    • Cú pháp

(ForClause | LetClause)+
                        [WhereClause]
                        [OrderByClause]
                        return ExprSingle

  • Mệnh đề for
    • Tạo ra các bộ dữ liệu tuần tự, mỗi bộ được gán cho một giá trị biến điều khiển, được gọi là tuple stream
    • Cơ chế hoạt động của mệnh để for khi Xquery xử lý
      • Thực hiện tạo ra các bộ dự liệu theo thứ tự
      • Kiểm tra từng bộ dữ liệu với điều kiện nếu có trong câu lệnh FLWOR
      • Đưa ra kết quả trả về có thể là một bộ dữ liệu đang có hay trích xuất hay kết xuất của quá trình xử lý dựa trên bộ dữ liệu tùy theo biểu thức kết quả trong mệnh đề return
      • 3 bước trên được thực hiện cho đến khi các bộ dữ liệu được duyệt qua hết
    • Mệnh đề for có thể xử lý nhiều hơn một biểu thức với nhiều biến. Khi điều này diễn ra, Xquery thực hiện tương tự như cơ chế thực hiện vòng lặp chứa trong vòng lặp với tiêu chí biến với biểu thức được khai báo là vòng lặp trong cùng, biến khai báo đầu tiên với biểu thức là vòng lặp ngoài cùng
    • Cú pháp

for $varName [as sequenceType] [at $pos] in expr [, …]

        • sequenceType các kiểu dữ liệu được định nghĩa như element(), atomic schema type, attribute(), node(), item() …

·         pos: thể hiện vị trí – thứ tự tương ứng với bộ dữ liệu đang được duyệt

        • expr: biểu thức xpath
  • Mệnh đề let
    • Tương tự như mệnh đề for nhưng các biến với biểu thức chỉ được thực hiện duy nhất một lần
    • Nếu như có nhiều hơn một biến khai báo thì Xquery chỉ tạo ra bộ dữ liệu duy nhất chứa tất cả biến đó
    • Cú pháp

let $varName [as sequenceType] := expr [, …]

      • Lưu ý cú pháp trên có phép toán gán thể hiện bằng :=
  • Mệnh đề where
    • Thể hiện điều kiện để lọc các kết quả của các bộ dữ liệu có được trong mệnh đề for hay let, tương tự như mệnh đề Where trong câu lệnh SQL nhưng biểu thức trong where ở Xquery chính là câu lệnh Xpath
    • Được sử dụng được tất cả các biến được khai báo trong mệnh đề for và let
    • Syntax

where expr

  • Mệnh đề return
    • Là kết xuất từ bộ dữ liệu, kết xuất hay xử lý từ các bộ dữ liệu hay định dạng theo kết xuất mong muốn
    • Syntax

return expr

  • Mệnh đề order by
    • Tương tự mệnh đề order by trong SQL nhưng sử dụng xpath
    • Syntax

order by expr [ascending|descending]

  • Một trong những lưu ý trong Xquery đó là tầm vực của biến, biến được khai báo trong for hay trong let, sau đó được sử dụng trong where, return, hay order by. Tuy nhiên, biến sau khi được khai báo không được sử dụng trực tiếp ngay trong mệnh đề for hay let – theo nghĩa là không bao giờ vửa khai báo mà vừa lại dùng
  • Ngoài ra, khi khai trùng biến trong Xquery thì kết quả có thể không như mong đợi vì biến thứ 2 có thể ghi đè biến thứ nhất, Xquery không báo lỗi trong trường hợp này
  • Tương tự như trường hợp khai báo biến trùng như đã nêu ở trên thì Xquery vẫn thực thi mà không báo lỗi và đưa về kết quả mà chúng ta không biết được trước

Một số ví dụ XQuery áp dụng các khái niệm nêu trên

  • Ví dụ 1

for $i in 1 to 3
return <oneEval>{$i}</oneEval>

    • Câu lệnh trên đang duyệt các giá trị từ 1 đến 3, mỗi lần duyệt một số sẽ gán số đó vào biến i
    • Trong mỗi lần duyệt sẽ trả ra kết quả là một node oneEval với giá trị biến i đang được duyệt

  • Ví dụ 2

for $i in reverse(1 to 3)
return <oneEval>{$i}</oneEval>

    • Tương tự ví dụ 1 nhưng chúng ta sử dụng hàm reverse để duyệt ngược từ 3 đến 1

  • Ví dụ 3

for $i in (1 to 10)[. mod 2 = 0]
return <oneEval>{$i}</oneEval>

    •  Trong ví dụ này chúng ta đang sử dụng một biểu thức xử lý tính toán để tạo ra tập dữ liệu là các giá trị chia hết cho 2 trong đoạn từ 1 đến 10

  • Ví dụ 4

for $i in (1, 2)
for $j in ('a', 'b')
return <oneEval>i is {$i}
and j is {$j}</oneEval>

    • Trong ví dụ này chúng ta đang duyệt tương tự như lập trình là cho i chạy từ 1 đến 2, khi i đang chạy thực hiện duyệt j với hai giá trị a và b để đưa ra kết quả tổng hợp từ i và j trong kết xuất trả về

    • Thay vì viết như lập trình, trong khái niệm và cú pháp Xquery đã hỗ trợ duyệt lồng nhiều cấp mà không cần sử dụng nhiều lần for mà chỉ cần khai báo các biến với các biểu thức trong mệnh đề for thì kết quả cũng tương đương về kết quả lẫn ngữ nghĩa

for $i in (1, 2),
$j in ('a', 'b')
return <oneEval>i is {$i}
and j is {$j}</oneEval>

  • Ví dụ 5

for $a in (1 to 50),
$b in (2, 3, 5, 7) 
where $a mod $b eq 0
return $a * $b

    • Ví dụ này chúng ta áp dụng ngữ nghĩa của ví dụ 4 và áp dụng thêm mệnh đề where để chọn những giá trị a chia hết cho b và đưa ra kết xuất là tích của a và b

  • Ví dụ 6

for $i in (1 to 3) 
return (<one>{$i}</one>,
<two>{$i}</two>)

    • Trong ví dụ này, chúng ta trả về nhiều hơn một kết quả cho mỗi lần duyệt của for, cụ thể là 02 node

  • Ví dụ 7

for $i at $j in 7 to 11 
return <oneEval>{$j}. {$i}</oneEval>

    • Trong ví dụ này, chúng ta thực hiện lấy luôn ví trí hay thứ tự của các bộ dữ liệu trong quá trình duyệt và đưa vào trong kết quả

  • Ví dụ 8

for $s
in (<one/>, <two/>, <three/>)
return <out>{$s}</out>

    • Trong ví dụ này chúng ta đang duyệt trong một tập node và trả ra tập node mới theo khái niệm tạo ra cấu trúc lưu trữ dữ liệu mới

  • Ví dụ 9

avg( 
for $x at $i in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
where $i mod 2 = 0
return $x)

    • Phối hợp hàm xpath với câu truy vấn xquery để tính kết quả dựa trên tập kết quả của xquery truy vấn, cụ thể là tính trung bình tất cả các giá trị mà chia hết cho 2 trong khoảng từ 1 đến 10

  • Ví dụ 10

for $boy at $boypos in ('Simon', 'Nigel', 'David'), 
$game at $gamepos in ('pushups', 'situps')
return <tuple n='{$boypos}'>
boy {$boypos} is {$boy}, item {$gamepos}: {$game}
</tuple>

    • Ví dụ này là truy vấn phức tạp phối hợp tất cả để tạo ra cấu trúc tại liệu theo ý muốn

  • Ví dụ 11
    • Sau 10 ví dụ tiếp cận xquery, chúng ta thực hiện áp dụng Xquery trên truy vấn cụ thể tài liệu XML

for $n
in fn:doc('src/book.xml')//book
return fn:data($n/fn:normalize-space(booktitle))

    • Trong ví dụ này chúng ta duyệt các node book và n được gán đến từng node book trong quá trình duyệt và đưa ra tựa sách – booktitle trong kết quả

for $n
as element(book)
at $i
in fn:doc('src/book.xml')//book
return fn:concat($i, '. ', fn:data($n/fn:normalize-space(booktitle)))

    • Trong ví dụ này chúng ta truy vấn kết hợp với lấy vị trí để đưa ra kết quả

for $b in fn:doc('src/book.xml')//book[price < 99.5]
order by $b/price descending
return $b

    • Trong ví dụ này chúng ta truy vấn kết hợp Xpath có điều kiện để lọc dữ liệu ngay trong mệnh đề for và thực hiện sắp xếp kết quả trả về theo price giảm dần

  • Ví dụ 12

let $i := (1 to 3)  
return <oneEval>{$i}</oneEval>

    • Trong ví dụ này, chúng ta đang chỉ sử dụng mệnh đề let, do vậy let chỉ thực hiện một lần nên cho dù duyệt giá trị từ 1 đến 3 nhưng let không duyệt từ giá trị như for mà let kết hợp với cả ba giá trị và đưa ra luôn kết xuất

  • Ví dụ 13

let $salary as xs:decimal := 5.0
return $salary * 2

    • Trong ví dụ này thực hiện tương tự khái niệm khai báo biền với kiểu thập phân và gán trị khởi tại và đưa ra kết quả với biến nhân 2

  • Ví dụ 14
    • Chúng ta sẽ thực hiện các việc phối hợp lệnh trên một tài liệu phức tạp như sau

for $prod in doc('src/catalog.xml')//product
let $prodDept := $prod/@dept
where $prodDept = 'ACC' or $prodDept = 'WMN'
return $prod/name

    • Trong ví dụ này, chúng ta thực hiện duyệt product trong tài liệu và khai báo biến prodDept để dùng biến đó trong mệnh đề where để lọc dữ liệu. Trong một lần duyệt, nếu dữ liệu nào thỏa thì sẽ trả ra name của node product

let $doc := doc('src/catalog.xml')  
for $prod in $doc//product
let $prodDept := $prod/@dept
let $prodName := $prod/name
where $prodDept = 'ACC' or $prodDept = 'WMN'
return $prodName

    • Để đơn giản câu lệnh, chúng ta có thể khai báo biến thông qua câu lệnh let để làm tường minh câu lệnh với cùng ngữ nghĩa và kết quả

for $prod in doc('src/catalog.xml')//product
let $prodDept := $prod/@dept
where $prod/number > 100
and starts-with($prod/name, 'F')
and exists($prod/colorChoices)
and ($prodDept = 'ACC' or $prodDept = 'WMN')
return $prod

    • Ví dụ này xử lý với điều kiện phức tạp kết hợp and tương tự như truy vấn với mệnh đề điều kiện phức tạp trong SQL

let $prods := doc('src/catalog.xml')//product  
for $d in distinct-values($prods/@dept),
$n in distinct-values($prods[@dept = $d]/number)
return <result dept='{$d}' number='{$n}'/>

    • Trong ví dụ này chúng ta đang thực hiện truy vấn dữ liệu nhưng loại bỏ những giá trị trùng trong kết quả tương tự sử dụng distinct trong câu lệnh SQL

  • Ví dụ 15
    • Chúng ta sẽ thực hiện kết hợp thêm một tài liệu document với ví dụ 14 để thể hiện khái niệm tương tự như join bảng trong câu lệnh SQL

for $item in doc('src/order.xml')//item,
$product in doc('src/catalog.xml')//product[number = $item/@num]
return <item num='{$item/@num}'
name='{$product/name}'
quan='{$item/@quantity}'/>

    • Ví dụ này đang kết giữa bảng catalog và bản order dựa trên file number và đưa ra kết xuất là lấy thông tin 02 document phối hợp lại với nhau

for $item in doc('src/order.xml')//item,
$product in doc('src/catalog.xml')//product
where $item/@num = $product/number
return <item num='{$item/@num}'
name='{$product/name}'
quan='{$item/@quantity}'/>

    • Trong ví dụ này tương tự ví dụ trên nhưng thay vì viết câu lệnh điều kiện sử dụng Xpath thì câu lệnh này đưa điều kiện thành mệnh đề Where để thể hiện tính rõ ràng trong câu lệnh XQuery

Một số khái niệm Xquery Nâng cao

  • Thay vì viết lệnh trực tiếp trong quá trình xử lý, Xquery cho phép viết ra các file riêng có đuôi dạng xq như các tập tin batch lệnh của sql để có thể thực hiện và đưa vào các chương trình thực hiện linh động hơn
  • Các file thường bắt đầu với phần prolog (ngữ nghĩa như XML) chứa thông tin cho phép Xquery xử lý như khai báo version XQuery, khai báo hàm, biến, khai báo namespace, import các file Xquery khác vào
    • Phần khai báo version cụ thể như sau

xquery version “1.0” encoding “utf-8”;

    • Khai báo namespace với cú pháp

declare namespace prefix=“URI namespace”

      • Ví dụ: declare namespace fobo = “http://www.fromoldbooks.org/ns/”;
    • Mặc định Xquery có một số namespace mặc định mà không cần khai báo cụ thể

§  xml = http://www.w3.org/XML/1998/namespace - hỗ trợ xml

§  xs = http://www.w3.org/2001/XMLSchema - hỗ trợ xml schema

§  xsi = http://www.w3.org/2001/XMLSchema-instance - hỗ trợ xml schema instance

§  fn = http://www.w3.org/2005/xpath-functions - hỗ trợ function xpath

import module namespace prefix=“URI namespace” at “file/url”;

import module “file|url”; - sử dụng chỉ cho file mà không cần quan tâm namespace

    • Khai báo biến với cú pháp

declare variable $name [ as type] := [external] value;

      • Biến tương tự khi khái niệm biến trong XSL
      • Ví dụ
        • declare variable $socks := “black”;
        • declare variable $sockprice as xs:decimal := 3.6;
        • declare variable $argyle as element(*) := <sock>argyle</sock>;
        • declare variable $places as xs:string := doc(“places.xml”);
    • Khai báo functions

declare function func_Name (param_list) as sequence_type {

     <function body>

}

      • Phần function body, có thể gọi function khác, câu lệnh Xpath, Xquery, FLWOR, …
      • Các thành phần khác tương tự như tạo function trong lập trình
  • Phần thứ 2 sau prolog là nội dung truy vấn chính thức hay câu lệnh Xquery
  • Ngoài ra, Xquery còn hỗ trợ chia module và lưu trữ dưới file có đuôi xqm
    • Có 02 loai là main – thư viện có thể thực thi và chứa đầy đủ nội dung của prolog và query truy vần. library module không thể thực thi mà phải nhúng vào main để thực thi, cụ thể library chỉ có thể chứa functions
  • Ví dụ
    • Tài liệu XML

declare function local:discountPrice(
$price as xs:decimal?, $discount as xs:decimal?,
$maxDiscountPct as xs:integer?) as xs:double? {
let $newDiscount := if ($discount) then $discount else 0
let $maxDiscount := if ($maxDiscountPct)
then ($price * $maxDiscountPct) div 100 else 0
let $actualDiscount := min(($maxDiscount, $discount))
return ($price - $actualDiscount)
};
for $prod in doc('src/catalog_1.xml')//product
return local:discountPrice($prod/number, $prod/discount, 15)

    • Ví dụ trên chúng ta đang khai báo hàm ở phần in đậm và sau đó sử dụng hàm ngay trong truy vấn. Kết quả chúng ta nhận được

Sử dụng API để áp dụng Xquery vào ứng dụng Java – J2EE/JavaEE

Yêu cầu

  • Nắm vững các khái niệm cơ bản về Xquery nêu trên
  • Nắm vững cú pháp và kiến thức về OOP, cụ thể Java
  • Nắm được một số bộ parser API DOM, SAX, Stax
  • Nắm được framework JAXB và cách vận hành và cài đặt
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22
  • Thư viện Saxon 9.5 download tại http://saxon.sourceforge.net/

Một số kiến thức cơ bản

  • Saxon là package hỗ trợ xử lý XML với các thành phần phiên bản cụ thể là XSLT 2, Xpath 2, Xquery 1, XML Schema
  • Ở đây chúng tôi hướng tới việc sử dụng SAXON trên khái niệm XQJ để áp dụng XQuery trong ứng dụng có kết hợp Java
  • XQJ API - XQuery API for Java
    • Tương tự như JDBC dùng để truy vấn dữ liệu trên tài liệu XML
    • Các bước thực hiện
      • Tạo datasource và Kết nối đến data source

XQConnection con = null;

try {

            SaxonXQDataSource ds = new SaxonXQDataSource();

            con = ds.getConnection();

            …

} catch (XQException ex) { …

} finally {

            try { if (con != null) {

                          con.close();

                  }

            } catch (XQException ex) { ex.printStackTrace();}

}

      • Tạo ra câu lệnh truy vấn hay đưa file xq vào để Xquery API xử lý
        • Tương tự như JDBC có 02 câu lệnh thường dùng là statement và prepareStatement thì câu lệnh truy vấn tương đương ở đây là createExpression và preparedExpression
        • Để thực thi query, chúng ta dùng lệnh executeQuery tương tự như JDBC
        • Kết quả truy vấn của chúng ta sẽ được đặt trong Sequence object tương tự như result set
        • CreateExpression

XQExpression xqe;
XQSequence xqs;
xqe = xqc.createExpression();
xqs = xqe.executeQuery(queryString)

        • PreparedExpression
          • Chúng ta truyền tham số với method bindXX tương tự như setXxx của JDBC

XQPreparedExpression xqp;
XQSequence xqs;
xqp = xqc.prepareExpression(queryString);
xqp.bindXxx(QNameValue, value, XQItemType);
xqs = xqp.executeQuery();

          • Để truyền giá trị tham số với giá trị mà không cần xác định tham số, chúng ta có thể sử dụng khái niệm context với ký hiệu dấu .

xqp.bindXxx(XQConstants.CONTEXT_ITEM, value, XQItemType);

          • Ngoài ra, câu truy vấn có thể đặt riêng trong tập tin đưa vào câu truy vấn

InputStream query;
query = new FileInputStream(filePath)
xqs = xqe.executeQuery(query);

      • Truy vấn kết quả trên xử lý và đưa vào ứng dụng để sử dụng

XQResultSequence result = null;

try {

                        …

                        String xquery = “”;

                        result = exp.executeQuery(xquery);

                        …

} catch (XQException ex) { …

} finally {

              try { if (result != null) {

                          result.close();

                  }

                        …

            } catch (XQException ex) { ex.printStackTrace();}

}

      • Duyệt kết quả tương tự như duyệt ResultSet trong JDBC
        • Chúng ta sử dụng phương next để duyệt từng dữ liệu tương tự như JDBC
        • Nếu kết quả là giá trị text hay kết quả kết xuất xử lý chỉ là duy nhất – atomic value, chúng ta sẽ xử lý như sau

while (result.next()) {

String str = result.getAtomicValue();

System.out.println("Title " + str);

}

        • Nếu kết quả trả ra một tập node, chúng ta có thể ghi thành file

Properties props = new java.util.Properties();

props.setProperty("method", "xml");

props.setProperty("indent", "yes");

FileOutputStream file;

try {

          file = new FileOutputStream("src/queryResult.xml");

          result.writeSequence(file, props);

} catch (FileNotFoundException ex) {…}

        • Để lấy kiểu dữ liệu vể kiểu Java xử lý, chúng ta dùng method getXxx
          • Ví dụ

Element employee = (Element)xqs.getObject();

String str = xqs.getAtomicValue();

        • Để ép kiểu về SAX
          • xqs.writeSequenceToSAX(ch);
          • xqs.writeItemToSAX(ch);
        •  Để ép kiểu về StAX dạng cursor
          • XMLStreamReader xmlReader = xqs.getSequenceAsStream();

Áp dụng vào ứng dụng Java

  • Ví dụ 1
    • Tạo project Java application bất kỳ
    • Import thư viện Saxon 9.5 vào

      • Tạo tập tin java thực hiện truy vấn

      • Thực thi

      • Ví dụ này chúng ta đang thực hiện lấy giá trị là chuỗi không phải node hay object – atomic value
  • Ví dụ 2
    • Truy vấn và tạo ra tập tin XML

 

      • Kết quả thực thi

  • Ví dụ 3
    • Sử dụng truy vấn có truyền tham số từ bên ngoài với createExpression

      • Kết quả thực thi

  • Ví dụ 4:
    • Sử dụng preparedExpression để truyền tham số thực thi trên câu lệnh nhiều hơn 1 lần

 

      • Kết quả thực thi

  • Ví dụ 5
    • Truyền tham số dạng context item, truyền duy nhất mà không có biết tham số với câu lệnh có 1 tham số

      • Kết quả thực thi

  • Ví dụ 6
    • Kết hợp Xquery truy vấn và đưa thành dạng DOM và ghi thành file XML

 

      • Ở đây chúng ta lại dùng context item để xác định tài liệu chúng ta đang truy vấn mà không cần xác định context trong câu lệnh xquery
      • Thực thi và kết quả

  • Ví dụ 7
    • Ví dụ này chúng ta sử dụng việc truy vấn Xquery và kết quả của nó sẽ được đưa tiếp vào một câu Xquery khác để truy vấn liên hoàn và nhận được kết quả cuối cùng

 

      • Kết quả thực thi

  • Ví dụ 8
    • Kết hợp Xquery với JAXB (chúng tôi sẽ giới thiệu trong một chủ đề khác) để tạo ra object, ghi file và duyệt dữ liệu
      • XML

      • XML Schema

      • Class phát sinh dựa trên schema

 

      • Code kết hợp Xquery và xử lý

 

      • Cấu trúc project

      • Kết quả thực thi

  • Ví dụ 9
    • Thực hiện query từ file riêng, tạo tính linh động trong code của ứng dụng
    • File xq

    • Cấu trúc Project

      • Code thực thi

      • Kết xuất

Chúc mừng các bạn đã hoàn tất và nắm các khái niệm về sử dụng XQuery cơ bản và ứng dụng nó với API – SAXON cùng một số công nghệ khác trong ứng dụng của java để tạo được kết xuất theo ứng dụng chúng ta yêu cầu.

Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở các chủ đề liên quan đến XML, cụ thể sẽ là các bộ parser DOM, SAX, Stax, framework JAXB, ….

Không có nhận xét nào:

Đăng nhận xét