Tải bản đầy đủ (.pdf) (71 trang)

Ultimate mashup – Các dịch vụ Web và Web ngữ nghĩa (semantic Web), Phần 1 ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (492.17 KB, 71 trang )

Ultimate mashup – Các dịch vụ
Web và Web ngữ nghĩa
(semantic Web), Phần 1: Sử
dụng kết hợp các dịch vụ Web
Khám phá các khái niệm về Mashup và xây dựng một Mashup đơn giản.
Nicholas Chase, Tác giả tự do, Site Dynamics Interactive Communications
Tóm tắt: Khi dịch vụ Web phát triển rộng rãi, các công ty dịch vụ Web và các
nhà phát triển ứng dụng web đã tạo ra những sáng kiến mới cùng với các dữ liệu
của chúng, bổ sung vào các ứng dụng đơn lẻ. Các nhà phát triển ứng dụng đang
tạo ra các Mashup, các ứng dụng kết hợp dữ liệu từ nhiều loại dịch vụ để tạo ra
những điều mới mẻ. Loạt bài này trình bày sự hình thành Mashup căn bản theo
trình tự thời gian, một ứng dụng mà không chỉ lưu dữ liệu từ các Mashup khác
nhau mà còn sử dụng các kỹ thuật ngữ nghĩa cho phép người dùng tạo ra Mashup
của riêng họ bằng cách thay đổi các dịch vụ hay thậm chí bằng cách chọn các dữ
liệu. Phương pháp này dùng trình Java (TM)™ kết hợp các servlet, JSP, dự án mã
nguồn mở Jena và các khả năng mới XML của DB2. Ở phần này Nicholas Chase
giới thiệu các khái niệm Mashup, cho bạn thấy các thức hoạt động của chúng và
cách xây dựng một phiên bản Mashup đơn giản.

Trước khi bạn bắt đầu
Bài viết này dành cho các nhà phát triển muốn học thêm về cách sử dụng và kết
hợp các dịch vụ Web từ góc độ XML, và cách xuất các dữ liệu đó lên Web. Tất cả
các dịch vụ được thảo luận ở trong bài viết đều là các dịch vụ REST nhưng các
khái niệm tương tự như đối với các dịch vụ SOAP. Bài viết này xem như bạn có
kiến thức cơ bản về lập trình Java™ XML, phát triển Web, và các khái niệm cơ
bản về các dịch vụ Web. Nếu bạn cần tìm hiểu lại ba chủ đề này hãy xem tài
nguyên để biết thêm chi tiết.
Về các bài viết này
Dường như bạn không thể vào Web mà không vào một trang Web hoặc là cung
cấp cho bạn quyền truy cập dữ liệu của nó thông qua hàm API dựa trên dịch vụ
web (Web-services-based API) hoặc là sử dụng dữ liệu từ trang web khác lấy từ


một API dựa trên dịch vụ web. Khi bạn xem xét lợi thế của việc sử dụng các thông
tin sẵn có trong ứng dụng của riêng bạn thì điều đó không hề gây ngạc nhiên. Đây
chỉ là vấn đề thời gian trước khi ai đó bắt đầu kết hợp dữ liệu từ các hệ thống khác
nhau để tạo ra một thứ hoàn toàn mới. Những ứng dụng này được gọi là các
Mashup, là hiện tượng thịnh hành nhất trên Web, từ các trang cộng đồng
(community-based) đến các trang tìm kiếm đặc biệt, và tới các Mashup từng xuất
hiện.
Hầu hết các Mashup rất hữu ích, nhưng chúng có một đặc điểm chung là chúng
được tạo ra cho một loạt các dịch vụ riêng biệt, và nếu một trong các dịch vụ đó
thay đổi hoặc dịch vụ riêng biệt của một loại hình cụ thể nào đó thay đổi thì bạn sẽ
có nhiều việc phải làm với nó.
Mục đích của loạt bài viết này nhằm tạo ra một ứng dụng Mashup tốt đến mức mà
người dùng có thể thêm hoặc bớt các dịch vụ nếu muốn, và hệ thống sẽ biết cách
giải quyết vấn đề này. Quá trình thực hiện sẽ diễn ra như sau:
Ở phần 1 giới thiệu khái niệm các Mashup, trình bày cách ứng dụng hoạt động và
xây dựng một phiên bản đơn giản nhất của một Mashup. Những sự cố trình bày
nghiêm trọng liên quan tới việc tạo ra hàng loạt các cuộc gọi trên Web cũng sẽ
được chỉ ra.
Ở phần 2, bạn giải quyết một số vấn đề bằng cách sử dụng tính năng mới
pureXML của DB2 để xây dựng một thẻ XML để lưu giữ các yêu cầu trước đó và
cũng để cho phép bạn truy lục các thông tin cụ thể.
Về cơ bản, bạn sẽ cần dùng các bản thể luận (ontologies), hoặc các từ vựng để
định nghĩa các khái niệm và mối quan hệ giữa chúng, vì thế ở phần 3 bạn bắt đầu
tiến trình này bằng cách tìm hiểu về RDF và RDFs, hai thành phần cơ bản nhất
trong từ ngôn ngữ Web (OWL) sẽ được đề cập đến trong phần 4. Ở phần 5 bạn lấy
các bản thể luận mà bạn tạo được ở phần 4 và sử dụng nó để cho phép người dùng
thay đổi nguồn gốc thông tin.
Phần 6 có thể nói là rất hấp dẫn đối với bạn. Ở đây, bạn có một ứng dụng đang
chạy và một khung làm việc để hệ thống có thể sử dụng lập luận ngữ nghĩa để hiểu
các dịch vụ tại điểm sử dụng của nó. Ở phần này, bạn cung cấp cho người dùng

quyền kiểm soát, cho phép người dùng lựa chọn dịch vụ trong bản thể luận và
chọn ra các dữ liệu để dùng cho một Mashup thông thường.


Về bài viết này
Thông qua bài viết này bạn sẽ học được cách tạo một ứng dụng để có thể truy lục
và hiển thị các thông tin dịch vụ Web từ một đặc điểm chung nào đó. Nói cách
khác, việc thêm các dịch vụ mới chính là một phần thực hành cấu hình còn hơn cả
lập trình.
Bài viết này hướng dẫn bạn cách:
 Yêu cầu dữ liệu từ một dịch vụ Web REST
 Dễ dàng xâu chuỗi dữ liệu XML để xuất hay hiển thị
 Tạo một khuôn mẫu XML và sau đó thay thế các phần tử và các thuộc tính
đã định trước bằng các dữ liệu động.
 Thêm các nút XML từ các loại văn bản vào một loại văn bản xuất
 Tạo một hệ thống hiện thị nhiều dịch vụ Web.
 Tạo một hệ thống mà ở đó một dịch vụ Web có thể cung cấp thông tin dựa
trên dữ liệu xuất của một dịch vụ Web thứ hai
Bài viết này sử dụng ngôn ngữ Java nhưng các khái niệm thì giống các ngôn ngữ
lập trình và hệ điều hành khác.


Các điều kiện tiên quyết
Bạn cần phải cài đặt và kiểm tra các phần mềm sau đây nhằm tuân theo các mã
trong bài viết này
 Apache Tomcat hoặc các công cụ servlet khác: Bài viết này giả định rằng
bạn sẽ xây dựng các ứng dụng Web sử dụng các servlet, vì thế bạn sẽ cần
có công cụ servlet như là Apache Tomcat. Nếu bạn chọn cách xây dựng
ứng dụng sử dụng môi trường khác thì hãy đảm bảo chắc chắn rằng bạn có
phần mềm thích hợp trong tay. Hãy tải phần mềm apache-tomcat-5.5.17.zip

và cài đặt nó vào trong một thư mực bất kỳ (Chú ý: không để dấu cách khi
viết tên thư mục).
 Java: bài viết này được xây dựng cùng Apache Tomcat 5.5, cần có Java 1.5
hoặc các phiên bản mới hơn. Tải phần mềm J2SE SDK.
 Để tiến hành công việc thuận lợi hơn bạn có thể sử dụng một IDE như
Eclipse hoặc IBM ®Rational™ Web Developer cho việc khai thác của bạn.
Bạn có thể tải Eclipse tại Eclipse.org tải phiên bản thử nghiệm của Rational
Web Developer hoặc dùng môi trường khai thác thông dụng của bạn. Bạn
sẽ không thể làm được gì thú vị trừ khi liên quan tới tài liệu thu thập và sự
triển khai của mình.
Ở các phần 2, 4, 5, và 6 của loạt bài viết bạn sẽ cần:
 IBM ®DB2® 9 (trước đây gọi là “Viper”): Các cơ sở dữ liệu liên quan bao
gồm các khả năng đáng kể của XML mà bạn sẽ cần biết khi đọc bài viết.
Bạn có thể tải về phiên bản thử nghiệm DB2 9: DB2 Enterprise 9 hoặc DB2
Express-C 9 phiên bản dữ liệu máy chủ DB2 Express 9 miễn phí.
Tổng quan
Trước khi bắt tay vào với công việc này bạn hãy tìm hiểu qua xem bạn đang cố
gắng làm điều gì.
Tại sao lại là các dịch vụ Web?
Hãy tin rằng bạn có thể định nghĩa được chúng, các dịch vụ Web đã từng là một
vấn đề rất nổi cộm cách đây hơn một thập kỷ nhưng bây giờ thậm chí bạn còn
được nghe đến nhiều hơn thế, đặc biệt là trên các trang Web. Tại sao lại thế? Vì nó
liên quan tới mức độ phát triển của Web tại thời điểm này.
Các dịch vụ Web là cách gửi thông tin qua lại giữa các máy chủ ở các mạng khác
nhau. Trong hầu hết các trường hợp, các thông tin qua lại là XML, chính XML
cung cấp một hệ điều hành và một bộ dữ liệu ngôn ngữ lập trình riêng biệt. Nói
cách khác, một máy chủ chạy một ứng dụng Perl trên Linux có thể gửi thông tin
thông qua Internet tới một máy chủ chạy ứng dụng Java trên Windows, và hiển
nhiên cả hai bên đều hiểu các thông tin này.
Lý do mà dịch vụ Web trở nên quan trọng là thế hệ mà theo một câu thần chú Ấn

độ "Thông tin cần được tự do" đã biến một sinh viên thất nghiệp chỉ trong một
đêm trở thành một một nhà phát kiến trong ngành công nghiệp thông tin. Điều này
dẫn tới một suy nghĩ là nếu ứng dụng Web của bạn không có một hàm API dựa
trên các dịch vụ web để cho phép các dịch vụ khác sử dụng các dữ liệu của bạn thì
bạn sẽ bị coi là lạc hậu, và có lẽ là một kẻ đáng nghi. Đôi khi điều tệ nhất bạn có
thể nói về một trang Web hay một ứng dụng là "Dịch vụ Web thật tuyệt vời nhưng
chúng cũng là một khu vườn được rào kín"
Và cuối cùng, một ứng dụng sẽ không được coi là tốt trừ khi nó để cho tất cả mọi
người có thể dùng nó thông qua các loại API.
SOAP với REST và XML-RPC
Bạn có một API nhưng không có nghĩa là API này giống API của những người
khác. Có khá nhiều lựa chọn tồn tại và không có chuẩn riêng biệt nào được chọn ra
mặc dù tính phổ biến của một loại API hay các thay đổi trong các quan điểm thông
thường (thường là lựa chọn của chuyên viên thiết kế). Trong nhiều trường hợp,
một ứng dụng cho phép truy cập thông qua một hoặc nhiều loại API.
Tại thời điểm này, các dạng API thông dụng nhất là:
 REST: Mặc dù không phải là dạng xuất hiện đầu tiên nhưng REST nhanh
chóng trở nên phổ biến vì sự đơn giản của nó. Tất cả những gì cần để thực
hiện được một yêu cầu chỉ là một URL. XML sẽ được gửi đáp trả tới một
yêu cầu HTTP, giống như một trang Web.
 SOAP: Giao thức là phương tiện chính ở đây, SOAP cung cấp thẳng cách
đưa ra một yêu cầu nhưng cách này hơi mạnh so với API. Và cách này cũng
khá phức tạp khi sử dụng. Có nghĩa là, có nhiều loại bộ dụng cụ để làm cho
tiến trình dễ dàng hơn và các dụng cụ như là bộ chuyển đổi ngôn ngữ mô tả
dịch vụ Web sang mã nguồn tạo cho SOAP là một lựa chọn phổ biến.
 XML-RPC: Hơi phức tạp hơn REST nhưng lại đơn giản hơn SOAP, XML-
RPC là một lựa chọn thích hợp cho các nhà lập trình thích phong cách
Remote Procedure Call (Gọi thủ tục điều khiển từ xa) của nó.
 JavaScript: Xu hướng mới nhất sử dụng API cho các ứng dụng mang lại
một thư viện miễn phí JavaScript là cách duy nhất để truy cập dữ liệu. Cách

làm này cho phép mọi người để dữ liệu trên các trang Web của họ một cách
dễ dàng nhưng lại hạn chế việc tích hợp với các dịch vụ khác. Trong vài
trường hợp, các dữ liệu từ các dịch vụ khác có thể được cung cấp cho
JavaScript API, nhưng cung cấp dữ liệu từ JavaScript API tới các dịch vụ
khác rất khó, có khi là không thể. Nghĩa là, tìm kiếm các giới hạn này được
gọi là "vườn rào kín" và để truy cập làm nhẹ đi bớt phần nào những hạn
chế.
Bây giờ, trừ một số trường hợp JavaScript APIs ngoại lệ, tất cả các APIs này đều
dựa trên khái niệm gửi XML tới một yêu cầu, nghĩa là nếu bạn xây dựng ứng dụng
của bạn trên ý tưởng XML nhận, về căn bản bạn sẽ có khả năng sử dụng tất cả mọi
thứ.
Để mọi thứ đơn giản hơn chúng ta hãy dùng REST, mặc dù các khái niệm này có
thể áp dụng cho bất kỳ ba lựa chọn đầu tiên nào.


Mashup là gì?
Mục đích cuối cùng của tất cả các thông tin đưa ra ở đây là giúp cho người dùng
có thể sử dụng các thông tin đó. Trong một số trường hợp nó có thể không diễn ra
hoàn toàn theo như ý bạn muốn. Ví dụ, Amazon Light chứa danh sách các sản
phẩm do Amazon.com bán (xem Tài nguyên), nhưng nó lại kết hợp các danh sách
đó với các dữ liệu lấy từ Google, Yahoo!, Del.icio.us, Blogger, và thậm chí cả
DropCash. ActorTracker (xem tài nguyên) kết hợp Amazon, eBay, và các dữ liệu
chuyển đổi khác. ChicagoCrime.org công khai các số liệu trên một bản đồ của
Google.
Thậm chí bạn có thể theo kịp các Mashup mới bằng việc đọc (hay đặt mua)
MashupFeed.com, ở đó có liệt kê danh sách các Mashup mới được ưa chuộng
bằng API. Ở đó cũng có một danh sách dài các API có sẵn để tương tác với các
Mashup mới trong trường hợp bạn muốn tạo Mashup của riêng mình.
Nói một cách cơ bản, một Mashup là một sự kết hợp thông in từ một hay nhiều
nguồn, trộn chúng lại theo cách bạn sẽ tạo ra một thứ mới mẻ hơn hoặc có ích hơn.



Mục đích toàn diện
Một điều mà các Mashup này chung nhau đó là chúng được tạo ra theo một mục
đích nhất định với rất nhiều sự lựa chọn - ví như loại dịch vụ nên dùng cách truy
cập dữ liệu, v.v đều được mã hóa trong ứng dụng. Mục đích của bạn là thay đổi
chúng. Bạn muốn tạo một ứng dụng cho phép người dùng tự đưa ra lựa chọn của
mình hay chuyển từ Google sang Yahoo!, hay từ Barnes và Noble sang
Amazon.com.
Bạn cũng muốn người dùng có khả năng tạo ra diều gì đó hoàn toàn mới mẻ mà
không phải lập trình.
Để điều đó xảy ra bạn cần làm một số việc sau:
1. Tạo một cấu trúc linh hoạt cho Mashup của bạn cho phép các dịch vụ có thể
được thay đổi dễ dàng.
2. Tạo một hệ thống lưu giữ cho phép bạn dễ dàng lưu và trộn dữ liệu.
3. Tạo một bản thể luận cho phép ứng dụng hiểu các dữ liệu mà nó đang xử
lý. Nói cách khác, ứng dụng đó hiểu một giá trị hoặc một vị trí là gì, ít nhất
là trong mối tương quan với các dữ liệu khác.
4. Tìm cách sử dụng bản thể luận đó một cách có hệ thống.
5. Cho người dùng cách tương tác với các dữ liệu khác để tạo ra các Mashup
mới.
Bạn sẽ có thể làm được tất cả những việc này trong loạt bài viết này.


Những việc cần làm đầu tiên
Trong bài viết này, để bắt đầu tiến trình đó bạn sẽ tạo một Mashup nhỏ để thực
hiện các đặc điểm này.
Đầu tiên, bạn hiển thị các thông tin cơ bản do một dịch vụ REST gửi lại. Sau đó
bạn sẽ tiếp tục tạo một khuôn mẫu XML cho phép bạn kiểm soát xem từng kết quả
REST sẽ hiện ra như thế nào.

Từ đây, bạn sẽ mở rộng hệ thống một cách đơn giản để hiển thị thông tin từ nhiều
dịch vụ khác nhau. Ví dụ, bạn sẽ thấy kết quả từ cả Yahoo! và Flickr.
Cuối cùng, bạn sẽ cho phép hệ thống trình bày nhiệm vụ phức tạp hơn của Mashup
khi hiển thị thông tin từ một API dựa trên thông tin do một API khác gửi lại. Ví
dụ, bạn sẽ cung cấp URLs do Yahoo! gửi trả lại tới dịch vụ Web Technorati để
kiểm tra xem có bao nhiêu mục trên trang thông tin cá nhân (blog) đề cập tới từng
URL.
Chúng ta cùng bắt đầu.
Lấy thông tin từ một đường dẫn XML
Bây giờ bạn đã thiết lập được mọi thứ, bạn có thể bắt đầu tạo một Mashup thực sự.
Bạn sẽ bắt đầu bằng cách lấy thông tin từ một tệp XML lưu trữ trên ổ cứng.
Dữ liệu mẫu
Tôi bắt đầu với một tệp XMLTV sẵn có trong ổ cứng của mình. Dữ liệu này cung
cấp thông tin chi tiết về các kênh và chương trình TV cùng với các thông tin và kế
hoạch cho mỗi chương trình. Vì tệp hoàn chỉnh nhiều hơn 10MB nên tôi chỉ trích
ra một mẫu nhỏ. Bạn có thể thấy cấu trúc này trong ví dụ 1.

Ví dụ 1. Dữ liệu mẫu
<?xml version="1.0"
encoding="ISO-8859-1"?> <tv source-
info-url="
source-info-name="TMS Data Direct
Service" generator-info-name="XMLTV"
generator-info-
url=" <programme
start="20060714043000
-0400" stop="20060714050000 -0400"
channel="I21883.labs.zap2it.com"> <title
lang="en">Flintstones</title> <sub-title
lang="en">The

Gravelberry Pie King</sub-title> <desc
lang="en">Fred gets
fired and enters the pie-baking
business.</desc> <credits>
<actor>Alan Reed</actor> <actor>Jean
Vander
Pyl</actor> <actor>Mel Blanc</actor>
<actor>Gerry Johnson</actor>
<actor>Don
Messick</actor> </credits>
<date>19651112</date> <category
lang="en">Children</category>
<category
lang="en">Animated</category>
<category
lang="en">Series</category> <episode-
num

system="dd_progid">EP001648.0149</episode-
num> <episode-num
system="onscreen">65149</episode-
num> <subtitles
type="teletext" /> <rating
system="VCHIP">
<value>TV-G</value> </rating>
</programme> <programme
start="20060714050000 -0400"
stop="20060714053000 -0400"
channel="I21883.labs.zap2it.com"> <title
lang="en">Dastardly &amp;

Muttley</title> <sub-title
lang="en">Muttley On the Bounty</sub-
title> <category
lang="en">Children</category>
<category
lang="en">Animated</category>
<category
lang="en">Series</category> <episode-
num

system="dd_progid">EP001168.0006</episode-
num> <episode-num
system="onscreen">6901</episode-
num>
<rating
system="VCHIP"> <value>TV-
G</value>
</rating> </programme> <programme
start="20060714053000
-0400" stop="20060714060000 -0400"
channel="I21883.labs.zap2it.com"> <title
lang="en">Banana Splits</title>
</programme>
</tv>

Đây là một tệp XML thông thường gồm có một phần tử gốc và một số các phần tử
mẫu tin. Trong trường hợp này các phần tử mẫu tin là các phần tử lập trình. Tôi
muốn lặp đi lặp lại từng phần tử này và hiển thị thông tin cụ thể.



Tách dữ liệu
Đầu tiên tách tài liệu thành bộ nhớ để bạn có thể làm việc với chúng, như ở ví dụ
2.

VÍ dụ 2. Tách văn bản (tài liệu)

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class SimpleClient {

public static void main(String[] args) {

try {

DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(
new File("/SW/xmltv-0.5.44-win32/sample.xml"));

} catch (Exception e){

e.printStackTrace();
}
}
}



Ứng dụng này không khó. Nó tạo ra một lớp để tách tệp trên hệ điều hành cục bộ
thành một đối tượng văn bản mà bạn có thể vận dụng sau này. Dĩ nhiên trong một
môi trường sản xuất bạn có thể tạo ra nhiều trường hợp ngoại lệ có thể vận dụng
trong trường hợp này hoặc các trường hợp khác sau này tốt hơn những gì tôi tiến
hành ở đây. Nhưng đây không phải là môi trường sản xuất và chúng ta cũng không
phải làm ra nhiều trường hợp như thế.
Trước đây, bạn có thể làm theo cách của mình là dùng đối tượng Document đó để
tìm các nút cố định. May thay, bây giờ bạn không phải làm thế nữa.


Giới thiệu XPath
Mỗi văn bản XML đều có cấu trúc, trước đây để xử lý từng văn bản bạn cần làm
theo kiểu cây, sử dụng một trong các mẫu đối tượng văn bản hoặc dùng một API
dựa vào sự kiện (event-based) như là SAX để tìm thông tin bạn cần.
Nhưng việc đó thật buồn cười, đặc biệt là đối với những nhà phát triển ứng dụng
quen làm việc với các phép biến đổi XML (XSL transformations) và các trang
theo phong cách của họ cho phép các nhà phát triển cụ thể hóa một nút hoặc một
nhóm các nút bằng việc sử dụng biểu thức XPath. Hãy xem ví dụ về biểu thức
XPath ở ví dụ 3.

Ví dụ 3. Biểu thức XPath

/tv/programme
//rating
//programme/@start
//title[@lang='en']

Chúng cụ thể hóa bất kỳ chương trình sản phẩm của phần tử tivi, bất kỳ phần tử
được sắp xếp ở đâu trong văn bản (hai nét gạch chéo (//) biểu thị sự tiếp nối của
nút hiện thời, trong trường hợp này lại là một phần tử gốc) thuộc tính đầu tiên của

bất kỳ phần tử lập trình nào và bất kỳ thuộc tính đầu đề đều có một thuộc tính
ngôn ngữ tương đương với en.
May mắn là ngày nay bạn không phải dùng tới các thủ thuật như là tạo một chuyển
đổi XML để sử dụng biểu thức XPath. Trong ứng dụng này bạn sẽ dùng chúng
trực tiếp từ ứng dụng Java của bạn để lấy bất kỳ thông tin nào bạn cần.


Đánh giá một biểu thức XPath
Mục đích của bạn là lặp đi lặp lại mỗi phần tử lập trình trong văn bản, vì thế bước
đầu tiên là bạn tạo một biểu thức XPath đại diện cho các phần tử lập trình này và
đánh giá biểu thức đó, như bạn sẽ thấy trong ví dụ 4.

Ví dụ 4. Đánh giá biểu thức XPath


import java.io.File;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.NodeList;

public class SimpleClient {

public static void main(String[] args) {

try {

DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(

new File("/SW/xmltv-0.5.44-win32/sample.xml"));

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//programme";

NodeList recordNodes =
(NodeList) xpath.evaluate(
expression, document, XPathConstants.NODESET);

System.out.println("The result has "+
recordNodes.getLength()+" nodes");

} catch (Exception e){

e.printStackTrace();
}
}
}

Đầu tiên tạo ra lớp XPath từ một XpathFactory. Khi bạn đã tạo được lớp đó rồi,
bạn có thể dùng phương thức evaluate() để lấy một NodeList của các nút tương
ứng bằng cách cung cấp cho nó biểu thức XPath đại diện cho các nút bạn cần,
cung cấp văn bản để tìm các nút, và loại dữ liệu mà bạn muốn nhận được.
Tham số cuối cùng này rất quan trọng. Trong trường hợp này bạn gửi lại một bộ
các nút nhưng có thể báo cho phương thức biết rằng bạn chỉ muốn một nút mà thôi
hoặc chỉ là một giá trị Boolean để báo cho bạn biết biểu thức đó có đại diện cho
bất kỳ một nút thực nào không.
Khi bạn nhận lại dữ liệu bạn nên xem chúng như một đối tượng NodeList bạn vừa
truy lục được bằng cách nào đó. Bạn có thể thấy rằng đoạn mã cần có số lượng các
nút, như cách bạn tiến hành với NodeList lấy được thông qua phương thức

getChildNodes() của DOM.
Nếu bạn chạy ứng dụng bằng tệp lệnh hoặc từ Eclipse hay IDE khác, bạn sẽ thấy
đầu ra (output) báo cho bạn biết có bao nhiêu phần tử lập trình có trong mỗi văn
bản, như ở ví dụ 5.

Ví dụ 5. Chạy ứng dụng
Kết quả có 12 nút



Tạo văn bản xuất (output)
Bạn có thể chạy qua từng văn bản và xuất từng phần dữ liệu riêng biệt nhưng việc
này làm bạn bị vướng lại với từng định dạng, phương thức hiển thị cụ thể, v.v
Thay vì thế, bạn sẽ tạo một văn bản xuất, một văn bản XML để bạn có thể bổ sung
thông tin bạn muốn xuất. Sau đó bạn có thể xuất tới nơi mà bạn chọn.
Ở ví dụ 6, bắt đầu bằng việc tạo ra một đối tượng văn bản thực.

Ví dụ 6. Tạo văn bản xuất (output Document)

import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import java.io.StringReader;

public class SimpleClient {

public static void main(String[] args) {

try {


NodeList recordNodes = (NodeList) xpath.evaluate(
expression, document, XPathConstants.NODESET);
System.out.println("The result has "+
recordNodes.getLength()+" nodes");

Document hostDoc = builder.parse(
new InputSource(new StringReader("<div />")));
Node hostRoot = hostDoc.getDocumentElement();

} catch (Exception e){

e.printStackTrace();
}
}
}

Bước đầu tiên là tạo một đối tượng Ducument và để làm điều này bạn tiến hành
tách một văn bản XML có một loại trình tiện ích (shell), trong trường hợp này là
element div để bạn đặt dữ liệu vào đó. Thay vì dùng một tệp thực, bạn có thể dùng
StringReader và một InputSource để tạo một đối tượng Document ngoài String.
Khi bạn có Document, bạn cần tham khảo phần tử gốc của nó để bổ sung dữ liệu.


Chuyển các nút từ văn bản này tới văn bản khác.
Bây giờ bạn có thể lấy một Node từ một Document và bổ sung nó vào một
Document khác. Bây giờ, dẫu sao cũng không tránh khỏi các lỗi thực tế xuất hiện.
Bạn cần phải nhập thông tin để chuyển nó từ văn bản nguồn đến văn bản xuất một
cách an toàn như bạn có thể nhìn thấy trong ví dụ 7.

Ví dụ 7. Chuyển các nút từ văn bản này tới văn bản khác.



NodeList recordNodes = (NodeList) xpath.evaluate(
expression, document, XPathConstants.NODESET);
System.out.println("The result has "+
recordNodes.getLength()+" nodes");

Document hostDoc = builder.parse(
new InputSource(new StringReader("<div />")));
Node hostRoot = hostDoc.getDocumentElement();

for (int i=0; i < recordNodes.getLength(); i++) {

Node importedNode =
hostDoc.importNode(recordNodes.item(i), true);
hostRoot.appendChild(importedNode);
hostRoot.appendChild(hostDoc.createTextNode("\n"));

}

} catch (Exception e){

e.printStackTrace();
}
}
}

Đối với mỗi Node ở trong NodeList, dùng phương thức importtNode của hostDoc
để tạo ra bản sao của Node thuộc về hostDoc. Tham số thứ hai báo cho ứng dụng
biết liệu có thực hiện một bản sao deep hay không. Nói cách khác, bằng cách cố

định giá trị đó đúng, bạn báo rằng bạn không chỉ cần programme elements (phần
tử lập trình) mà còn cần cả các sản phẩm khác của element (phần tử).
Khi bạn đã nhập bản sao đó vào hostDoc, bạn có thể nối nó vào hostRoot. Sau đó
bổ sung một nút dòng văn bản đơn giản để kết quả dễ đọc hơn.


Xuất kết quả
Để xuất kết quả bạn sẽ phải dùng một thủ thuật XSLT-related cũ để xâu chuỗi nó
tới dòng lệnh, như trong ví dụ 8.

Ví dụ 8. Xuất kết quả

import java.io.StringReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class SimpleClient {

for (int i=0; i < recordNodes.getLength(); i++) {

Node importedNode =
hostDoc.importNode(recordNodes.item(i), true);
hostRoot.appendChild(importedNode);
hostRoot.appendChild(hostDoc.createTextNode("\n"));

}

DOMSource source = new DOMSource(hostDoc);

StreamResult result = new StreamResult(System.out);
TransformerFactory transFactory =
TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(source, result);

} catch (Exception e){

e.printStackTrace();
}
}
}

Đầu tiên bạn tạo một DOMSource ngoài Document mà bạn muốn xuất. Sau đó tạo
một StreamResult đại diện cho dòng lệnh đó. Từ đây, tạo một newTransformer,
nhưng đừng cung cấp cho nó một tờ mẫu (style sheet) bởi vì bạn muốn Document
không bị thay đổi. (Đây là một trong những tiện ích của phương thức xuất này.
Nếu sau đó bạn quyết định chuyển dữ liệu trước khi xuất thì việc bổ sung một tờ
mẫu vào tiến trình cũng là việc bình thường)


Kết quả
Bạn có thể thấy kết quả xuất như trong ví dụ 9.

Ví dụ 9. Kết quả văn bản xuất

Kết quả có 12 nút
<?xml version="1.0" encoding="UTF-8"?><div><programme
channel="I21883.labs.zap2it.com" start="20060714043000 -0400"
stop="20060714050000-0400">

<title lang="en">Flintstones</title>
<sub-title lang="en">The Gravelberry Pie King</sub-title>
<desc lang="en">Fred gets fired and enters the pie-baking
business.</desc>
<credits>
<actor>Alan Reed</actor>
<actor>Jean Vander Pyl</actor>
<actor>Mel Blanc</actor>
<actor>Gerry Johnson</actor>
<actor>Don Messick</actor>
</credits>
<date>19651112</date>
<category lang="en">Children</category>
<category lang="en">Animated</category>
<category lang="en">Series</category>
<episode-num system="dd_progid">EP001648.0149</episode-num>
<episode-num system="onscreen">65149</episode-num>
<subtitles type="teletext"/>
<rating system="VCHIP">
<value>TV-G</value>
</rating>
</programme>
<programme channel="I21883.labs.zap2it.com" start="20060714050000 -
0400" stop="20060714053000 -0400">
<title lang="en">Dastardly &amp; Muttley</title>

</programme> <programme channel="I21883.labs.zap2it.com"
start="20060714053000 -0400" stop="20060714060000 -0400">
<title lang="en">Banana Splits</title>


</programme>

</div>

Lưu ý rằng bạn vẫn còn câu lệnh xuất gốc, và dữ liệu vẫn không hề thay đổi, ngoại
trừ bây giờ dữ liệu nằm ở element.
Trong phần tiếp theo bạn sẽ tìm hiểu cách thay đổi cấu trúc của dữ liệu đã xuất
bằng cách sử dụng các khuôn mẫu có dạng XML (XML-based).
Dùng khuôn mẫu để làm mọi thứ đồng nhất
Đến đây bạn đã xem xét cách truy lục một văn bản XML, tìm các bản ghi riêng lẻ
và xuất chúng ra. Tất cả đều trôi chảy nhưng về lâu dài tốt nhất là nên xuất chúng
trực tiếp. Trong phần này bạn bắt đầu tiến trình chuyển dữ liệu sang dạng thích
hợp hơn thông qua các khuôn mẫu.
Sử dụng các khuôn mẫu
Mục đích căn bản là tạo một ứng dụng cho phép người dùng có quyền lựa chọn về
nội dung cần hiển thị. Vì thế, việc bạn cần làm là tạo một hệ thống yêu cầu lập
trình thay đổi sự xuất hiện của dữ liệu. Để giải quyết vấn đề này bạn có thể tạo ra
các khuôn mẫu để chèn các dữ liệu động vào đó.
Ví dụ ban có thể tạo một khuôn mẫu như khuôn mẫu trong ví dụ 10.

Ví dụ 10. Khuôn mẫu

<p><b><value/></b>:
<value/></p>

Khuôn mẫu này có hai giá trị mà bạn có thể thay thế bằng dữ liệu động. Ví dụ 11
sẽ chỉ rõ hai cách dùng khác nhau của khuôn mẫu đơn giản này.

Ví dụ 11. Hai cách dùng khác nhau một khuôn mẫu


<p><b>The West Wing</b>: When a
uranium-bearing rig crashes in an Idaho tunnel, the White House
scrambles
to assess the potential crisis; election strategists mull dropping
Vice
President Hoynes (Tim Matheson) from the Democratic
ticket.</p>
<p><b>One killed, one missing in Ohio storms; rare
twister
in New York state</b>: (Undated-AP) July 13, 2006 - At least
one person died after up to nine inches of rain brought flooding
to Indiana
and Ohio, while tornado north of New York City partly collapsed
a commercial
building and ripped the roof off a hotel.</p>


Ở trường hợp thứ nhất, đây là dữ liệu của TV, và ở trường hợp hai là các kết quả
tìm kiếm. Sự khác nhau giữa chúng là nguồn gốc tài liệu và biểu thức XPath đại
diện cho những thứ được bổ sung. Ở trường hợp thứ nhất đó là /tv/programme/title
và /tv/programme/desc lấy giá trị từ XML. Trường hợp thứ hai là
/ResultSet/Result/Title và /ResultSet/Result/Summary lấy giá trị từ kết quả tìm
kiếm trên Yahoo!. Trong phần này, bạn sẽ xem xét việc sử dụng XPath để chèn dữ
liệu vào một khuôn mẫu và sau đó xuất kết quả dữ liệu.


Tạo văn bản khuôn mẫu
Bắt đầu, tạo một đối tượng Document ngoài khuôn mẫu, như bạn thấy ở ví dụ 12

×