PDF:

XML: Cầu nối giữa GWT và PHP
GWT có thể sử dụng các dịch vụ PHP, và XML cung cấp một cầu nối
giúp trao đổi dữ liệu giữa chúng trở nên đơn giản
Federico Kereki
Kỹ sư hệ thống
自由职业者
16 10 2009
Các ứng dụng trong bộ công cụ Web của Google (Google Web Tools), ngoại trừ việc kết nối tới
các servlet bằng ngôn ngữ Java™ đang được ưa chuộng, nó cũng có thể sử dụng các dịch vụ
Web PHP để gửi và nhận dữ liệu trong XML. Bạn sẽ khảo sát các phương thức để tạo ra các tài
liệu XML và xử lý chúng bằng cả hai ngôn ngữ Java và PHP. (Servlets là các đối tượng của ngôn
ngữ Java, nó xử lý động các yêu cầu và sinh các trả lời, nó chạy trên máy chủ)
Các từ viết tắt thường sử dụng
•
•
•
•
•
•
Ajax: JavaScript không đồng bộ + XML
PEAR: PHP mở rộng và chứa ứng dụng
RPC: Gọi thủ tục từ xa
RSS: Really Simple Syndication
W3C: World Wide Web Consortium
XML: Ngôn ngữ đánh dấu mở rộng
GWT cho phép dễ dàng truy cập đến các servlet phía-máy chủ được lập trình bằng ngôn ngữ Java,
và dữ liệu được di chuyển một cách rõ ràng theo chuẩn nhất định giữa máy khách và máy chủ. Tuy
nhiên, khi bạn làm việc với GWT, bạn không bị giới hạn khi giao tiếp với các servlet, và bạn có thể
tự do chuyển đổi dữ liệu với tất cả các loại dịch vụ Web. Trong nhiều trường hợp (với các dịch vụ
đơn giản), bạn có thể chuyển đổi với đoạn văn bản đơn giản, nhưng với dữ liệu có cấu trúc hoặc
phức tạp hơn (ví dụ như RSS), sự khác biệt với XML sẽ được thể hiện rõ.
Bài viết này khảo sát một ứng dụng GWT đơn giản và một vài dịch vụ Web PHP, nhằm chỉ ra một
vài cách khác nhau để tạo ra và sử dụng các tài liệu XML. Điều này có nghĩa rằng nó không những
là một tài liệu hướng dẫn tỉ mỉ hay một cuốn sổ tay hướng dẫn mà hơn thế nữa chúng là các lời gợi
ý hay lời mách nước mà bạn có thể dễ dàng hơn khi bắt đầu làm việc với XML trong vai trò như là
một cầu nối giữa GWT và PHP.
© Copyright IBM Corporation 2009
XML: Cầu nối giữa GWT và PHP
Nhẫn hiệu đăng ký
Trang 1 của 14
developerWorks®
ibm.com/developerWorks/vn/
Một ứng dụng thử nghiệm
JSON: Có thể tồn tại chung với ngôn ngữ khác
Phần độc đáo của ngôn ngữ JavaScript™, JavaScript Object Notation (JSON) cuối cùng cũng
ra đời có đầy đủ những tính năng có thể thay thế XML một cách hiệu quả. JSON cung cấp
một định dạng dựa trên văn bản đơn giản, dễ đọc đại diện cho các mảng và các đối tượng.
Hơn thế nữa, chắc chắn là XML và JSON miêu tả cho cùng dữ liệu mà các dữ liệu này có thể
tương đương về dung dượng. Một vài trang Web nổi tiếng (ví dụ như Google hay Yahoo!)
cung cấp JSON cũng giống như XML.
Một lợi thế của JSON là JavaScript có thể xử lý rất nhanh (thí dụ nó có thể chuyển đổi JSON
thành một đối tượng với duy nhất một câu lệnh), điều này giúp nó có sức lôi cuốn lớn đối với
các nhà phát triển Web. Bởi vì GWT biên dịch tất cả mã lệnh phía máy khách thành mã lệnh
JavaScript, điều này chứng tỏ một lý lẽ rằng GWT cung cấp một thư viện tốt cho nó, và tất cả
các ví dụ trong bài viết này cũng có thể được lập trình với JSON thay vì dùng XML. Hãy ghé
thăm Tài nguyên để có các liên kết nhằm biết thêm thông tin về JSON.
Nhằm chỉ ra làm thế nào bạn có thể sử dụng XML như là một cầu nối giữa PHP và GWT, tôi cung
cấp một ứng dụng đơn giản dựa trên cơ sở dữ liệu về các quốc gia/các vùng miền/các thành phố.
Khi nhìn vào đoạn mã tạo cơ sở dữ liệu trong Ví dụ 1, bạn có thể thấy rằng:
• Các quốc gia đều có một mã riêng và duy nhất (ví dụ, UY cho Uruguay) và kèm theo là tên
nước.
• Các quốc gia được chia thành các vùng miền, được nhận dạng cùng với mã (mã này là duy
nhất trong quốc gia đó) và kèm theo tên vùng miền.
• Các vùng miền có các thành phố, chúng có một tên (dựa theo mã ASCII thuần túy), và một
tên chính xác của thành phố đó (chúng có thể bao gồm các ký tự lạ tùy thuộc vào ngôn ngữ
của quốc gia đó), dân số (hoặc bằng 0 nếu không được xác định), vĩ độ và kinh độ. Tên của
thành phố có thể trùng với tên thành phố của các vùng miền khác trong quốc gia đó.
Ví dụ 1. Đoạn mã tạo cơ sở dữ liệu
CREATE DATABASE world
DEFAULT CHARACTER SET latin1
COLLATE latin1_general_ci;
USE world;
CREATE TABLE countries (
countryCode char(2) NOT NULL,
countryName varchar(50) NOT NULL,
PRIMARY KEY (countryCode)
KEY countryName (countryName)
);
CREATE TABLE regions (
countryCode char(2) NOT NULL,
regionCode char(2) NOT NULL,
regionName varchar(50) NOT NULL,
PRIMARY KEY (countryCode,regionCode),
KEY regionName (regionName)
);
CREATE TABLE cities (
countryCode char(2) NOT NULL,
cityName varchar(50) NOT NULL,
cityAccentedName varchar(50) NOT NULL,
regionCode char(2) NOT NULL,
population bigint(20) NOT NULL,
XML: Cầu nối giữa GWT và PHP
Trang 2 của 14
ibm.com/developerWorks/vn/
developerWorks®
latitude float(10,7) NOT NULL,
longitude float(10,7) NOT NULL,
KEY `INDEX` (countryCode,regionCode,cityName),
KEY cityName (cityName),
KEY cityAccentedName (cityAccentedName)
);
Tôi tạo ra một dự án GWT đơn giản với chỉ một biểu mẫu và một vài dịch vụ Web PHP. (Bạn có thể
tải về máy tính để có đoạn mã nguồn đầy đủ.) Khi bạn bắt đầu chạy ứng dụng, bạn có thể nhìn thấy
một cửa sổ đơn giản như trong Hình 1.
Hình 1. Biểu mẫu trống
Biểu mẫu GWT cho phép bạn nhập tên thành phố và gọi dịch vụ PHP để lấy tất cả các thành phố
có tên phù hợp với tên thành phố mà bạn đã nhập. Các thành phố được hiển thị ở dạng bảng các
ô vuông, và bạn có thể chỉnh sửa các trường thông tin như dân số, kinh độ và vĩ độ. Bạn có thể gửi
các dữ liệu đã chỉnh sửa này quay lại dịch vụ Web PHP thứ hai, dịch vụ này sẽ cập nhật vào cơ sở
dữ liệu. Tất cả dữ liệu truyền đi được định dạng bằng XML. Năm 2009, lễ kỉ niệm sinh nhật lần thứ
200 của Charles Darwin và lần thứ 150 ra đời cuốn sách của ông Nguồn gốc muôn loài, bạn có thể
tìm kiếm các thành phố cùng với tên DARWIN; Xem Hình 2 cho các kết quả.
XML: Cầu nối giữa GWT và PHP
Trang 3 của 14
developerWorks®
ibm.com/developerWorks/vn/
Hình 2. Kết quả tìm kiếm các thành phố cùng với tên "Darwin"
Một vài cấu hình bổ xung
Thông tin này chỉ mang tính tham khảo, tôi đã làm việc với:
•
•
•
•
GWT phiên bản 1.5.3
PHP phiên bản 5.2.8
MySQL® cơ sở dữ liệu máy chủ phiên bản 5.0.67
Apache phiên bản 2.2.10 dưới OpenSUSE® phiên bản 11.1
Sau khi tôi cài đặt tất cả các phần mềm nhưng GWT vẫn yêu cầu một bước cấu hình thêm nữa
vậy nên tôi có thể kiểm tra kết nối GWT-PHP; xem thêm tại Vấn đề về SOP để hiểu tại sao. Để
vô hiệu chính sách cùng nguồn (SOP) hãy kiểm tra bên trong trình duyệt GWT, chỉnh sửa tệp ./
mozilla-1.7.12/greprefs/all.js trong thư mục GWT của bạn và thêm các dòng lệnh như trong Ví dụ 2
vào phần cuối cùng của tệp:
XML: Cầu nối giữa GWT và PHP
Trang 4 của 14
ibm.com/developerWorks/vn/
developerWorks®
Ví dụ 2. Thay đổi cấu hình bên trong trình duyệt GWT
pref("capability.policy.default.XMLHttpRequest.abort", "allAccess");
pref("capability.policy.default.XMLHttpRequest.getAllResponseHeaders","allAccess");
pref("capability.policy.default.XMLHttpRequest.getResponseHeader","allAccess");
pref("capability.policy.default.XMLHttpRequest.open", "allAccess");
pref("capability.policy.default.XMLHttpRequest.send", "allAccess");
pref("capability.policy.default.XMLHttpRequest.setRequestHeader","allAccess");
pref("capability.policy.default.XMLHttpRequest.onreadystatechange","allAccess");
pref("capability.policy.default.XMLHttpRequest.readyState", "allAccess");
pref("capability.policy.default.XMLHttpRequest.responseText","allAccess");
pref("capability.policy.default.XMLHttpRequest.responseXML","allAccess");
pref("capability.policy.default.XMLHttpRequest.status", "allAccess");
pref("capability.policy.default.XMLHttpRequest.statusText", "allAccess");
Vấn đề về SOP
SOP là một sự hạn chế đáng tin cậy mà về cơ bản nó ngăn chặn các trang Web được tải từ
nguồn chắc chắn (nghĩa là giao thức/hệ chủ/cổng là một bộ ba của URL) truy cập dữ liệu từ
một nguồn khác. (Windows® Internet Explorer® đã hơi kiêu ngạo về SOP và bỏ qua sự thay
đổi của các cổng, mặc dù đó không phải là điều bắt buộc.) Ví dụ, nếu máy khách Web GWT
của bạn được tải từ http://www.yoursite.com:80/some/page/at/your/site, SOP sẽ không cho
phép máy khách của bạn lấy dữ liệu khác từ cùng một URL, các lời gọi bị chặn khi giao tiếp
với https://www.yoursite.com (do khác giao thức), http://othersite.com (do khác hệ chủ) và
ngay cả http://www.yoursite.com:81 (do khác cổng).
SOP thực sự là một ý tưởng tốt, bởi vì nó không cho phép mã JavaScript từ một nguồn chắc
chắn được truy cập và điều khiển dữ liệu được lấy từ nguồn khác. Trong thực tế, SOP bị vô
hiệu hóa có thể là điều các phisher thực sự mong muốn: Giống như khi bạn nhìn thấy có hiệu
lực, hợp pháp nhưng thực ra có một nhóm thứ ba giám sát nó. Nếu SOP ở vị trí đó, bạn có
thể thư giãn mà chắc chắn rằng bất cứ thứ gì bạn nhìn thấy thì chúng đều được gửi từ nguồn
mong muốn; nó không thể là bất cứ đoạn mã nào từ các nguồn khác (các nguồn đáng nghi
ngờ).
Ngược lại, với các nhà phát triển GWT, SOP đúng là phiền hà. Khi bạn chạy thử ứng dụng của
mình ở chế độ máy chủ phục vụ, nó kết nối tới cổng 8888, nhưng với các dịch vụ PHP bạn sẽ
muốn truy cập thông qua cổng tiêu chuẩn 80, vậy nên SOP sẽ từ chối lời gọi này. (Tất nhiên,
sau khi bạn thay đổi ứng dụng của mình sang chế độ biên dịch, nó sẽ chạy một cách hoàn
hảo, bởi vì nó cũng chạy từ cổng tiêu chuẩn 80, điều này liên quan đến SOP.) Bạn sẽ không
muốn truy cập tất cả các loại cổng của các trang Web; bạn chỉ muốn truy cập cổng khác từ
cùng một nguồn, nhưng SOP sẽ không cho phép bạn làm vậy.
Bất cứ khi nào bạn cập nhật GWT, bạn sẽ phải thay đổi lại điều này. Chính vì vậy, bạn nên hiểu rằng
nếu không làm vậy, bạn có thể viết mã bị lỗi trong chế độ máy chủ phục vụ nhưng có thể chạy rất
tốt trong chế độ biên dịch; sau khi thực hiện sự thay đổi, bạn có thể có mã lệnh có thể chạy ở chế
độ máy chủ phục vụ nhưng lại lỗi trong chế độ biên dịch, hãy chú ý điều này!
Gửi XML bằng PHP
Ứng dụng này chỉ định nghĩa một biểu mẫu đơn giản, với một vài nhãn, một hộp văn bản, hai nút
điều khiển, và mạng lưới các ô vuông cho việc hiển thị kết quả. Bất cứ khi nào bạn kích chuột vào
Get cities, ứng dụng sẽ gọi dịch vụ PHP để lấy một tài liệu XML với tất cả các tên thành phố phù
hợp với nội dung bạn gõ trong hộp văn bản nhập. Ví dụ 3 là một ví dụ ngắn về XML mà nó được gửi
từ dịch vụ PHP đến ứng dụng GWT. Đoạn mã XML được tạo ra nhằm minh họa một vài khả năng
của XML và hơn thế nữa nó còn có thể được sử dụng cho các ứng dụng thực tế. Điển hình là dịch
XML: Cầu nối giữa GWT và PHP
Trang 5 của 14
developerWorks®
ibm.com/developerWorks/vn/
vụ XML được tổ chức tốt sử dụng ít thẻ hơn và nhiều thuộc tính hơn, loại bỏ việc thụt vào ở đầu
dòng và do đó tài liệu sẽ ngắn hơn.
Ví dụ 3. Tài liệu XML được tạo ra khi tìm kiếm từ "tokyo"
<?xml version="1.0" encoding="UTF-8"?>
<cities>
<city name="tokyo">
<country code="JP" name="Japan"/>
<region code="40" name="Tokyo"/>
<coords>
<lat>35.6850014</lat>
<lon>139.7513885</lon>
</coords>
<pop>31480498</pop>
</city>
<city name="tokyo">
<country code="PG" name="Papua New Guinea"/>
<region code="01" name="Central"/>
<coords>
<lat>-8.3999996</lat>
<lon>147.1499939</lon>
</coords>
</city>
<city name="tokyojitori">
<country code="KR" name="Korea, Republic of"/>
<region code="16" name="Cholla-namdo"/>
<coords>
<lat>34.2380562</lat>
<lon>125.9394455</lon>
</coords>
</city>
</cities>
Có hai phiên bản sử dụng dịch vụ PHP khác nhau — getcities1.php và getcities2.php — hai phiên
bản này chỉ ra hai cách khác nhau để tạo ra tài liệu XML.
Cách đơn giản nhất để tạo XML là chỉ in các chuỗi văn bản thích hợp hoặc tạo ra các chuỗi ký tự,
sau đó sử dụng lệnh echo. Bạn nên thiết lập loại nội dung text/xml sau đó nó sẽ được nhận ra một
cách chính xác và bạn cũng nên nhớ thêm vào các dòng chú thích một cách tương đối nhằm xác
định phiên bản XML và ý nghĩa các dòng lệnh. Bạn sẽ không được quên cách sử dụng một số kí tự
đặc biệt như nhỏ hơn (<), lớn hơn (>), hay dấu và (&); cách dễ nhất là sử dụng htmlspecialchars(),
đây là một hàm PHP. Câu lệnh này rất đơn giản, giống như đoạn mã được chỉ ra trong Ví dụ 4. Chú
ý rằng thụt vào đầu dòng và xuống dòng thực sự là không cần thiết, nhưng nhờ nó chúng ta có thể
đọc mã một cách dễ dàng.
Ví dụ 4. Phương thức đơn giản nhất để tạo ra XML từ dịch vụ PHP
...
header("Content-type: text/xml");
...
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
echo '<cities>'."\n";
...
while ($row= mysql_fetch_assoc($result)) {
echo ' <city name="'.htmlspecialchars($row['cityName']).'">'."\n";
echo ' <country code="'.$row['countryCode'].'" ';
echo 'name="'.htmlentities($row['countryName']).'"/>'."\n";
echo ' <region code="'.$row['regionCode'].'" ';
XML: Cầu nối giữa GWT và PHP
Trang 6 của 14
ibm.com/developerWorks/vn/
developerWorks®
echo 'name="'.htmlentities($row['regionName']).'"/>'."\n";
echo
echo
echo
echo
'
'
'
'
<coords>'."\n";
<lat>'.$row['latitude'].'</lat>'."\n";
<lon>'.$row['longitude'].'</lon>'."\n";
</coords>'."\n";
if ($row['population']>0) {
echo ' <pop>'.$row['population'].'</pop>'."\n";
}
echo ' </city>'."\n";
}
echo '</cities>'."\n";
Phương thức thứ hai để tạo ra mã XML là sử dụng XMLWriter. (Và XMLReader, cho phép xử lý tài liệu
XML.) Bạn có thể quên đi các ký tự như lớn hơn, nhỏ hơn,..., phương thức này sẽ tự động giám sát
chúng. Mặc dù nó có vẻ dài dòng hơn phương thức thứ nhất khi sử dụng echo(), phương thức này
chỉ ra rằng cách tiếp cận này giúp chúng ta có thể dễ hiểu mã lệnh hơn. Đặc biệt là khi sử dụng giao
thức php://output đoạn văn bản sẽ được phát với câu lệnh echo. (Xem Ví dụ 5.)
Ví dụ 5. XMLWriter cung cấp phương thức đơn giản để xây dựng một tài liệu XML
một phần tử liên tiếp nhau
...
$writer= new XMLWriter();
$writer->openURI('php://output')
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement("cities");
while ($row= mysql_fetch_assoc($result)) {
$writer->startElement("city");
$writer->writeAttribute("name", $row['cityName']);
$writer->startElement("country");
$writer->writeAttribute("code", $row['countryCode']);
$writer->writeAttribute("name", $row['countryName']);
$writer->endElement();
$writer->startElement("region");
$writer->writeAttribute("code", $row['regionCode']);
$writer->writeAttribute("name", $row['regionName']);
$writer->endElement();
$writer->startElement("coords");
$writer->writeElement("lat", $row['latitude']);
$writer->writeElement("lon", $row['longitude']);
$writer->endElement();
if ($row['population']>0) {
$writer->writeElement("pop", $row['population']);
}
$writer->endElement(); // city
}
$writer->endElement(); // cities
...
Nếu bạn muốn thử nghiệm với các phương thức khác nữa để tạo ra XML, PHP chắc chắn có rất
nhiều đề xuất. Ví dụ, bạn có thể sử dụng SimpleXML; sau này bạn sẽ sử dụng nó để đọc XML,
nhưng nó cũng đồng thời cung cấp việc tạo ra tài liệu XML. Cũng như vậy, bạn có thể xem qua
XML: Cầu nối giữa GWT và PHP
Trang 7 của 14
developerWorks®
ibm.com/developerWorks/vn/
khung làm việc PEAR, nó bao gồm một vài lớp giúp dễ dàng tạo ra tài liệu XML. (Xem liên kết đến
Tài nguyên để có thêm thông tin.)
Xử lý XML với GWT
GWT cung cấp duy nhất gói XMLParser (tại địa chỉ com.google.gwt.xml.client ) cho cả hai việc
đọc và viết XML. Bạn có thể sử dụng phương thức parse() để tạo một tài liệu Document, sau đó sử
dụng getDocumentElement() để lấy phần tử gốc của nó; sau đó bạn có thể bắt đầu làm việc với tài
liệu XML này.
Một điều quan trọng là bạn nên sử dụng phương thức removeWhitespace() để loại bỏ các khoảng
trắng ra khỏi tài liệu của mình. Trình duyệt đôi khi tạo ra các nút văn bản trống tương ứng với các
dấu tab hay dấu xuống dòng, và nếu bạn không loại bỏ được chúng, xử lý của bạn sẽ gặp vấn đề
lạ, xuất hiện các phần tử không mong muốn, chúng có thể phá hỏng logíc của bạn (Xem Ví dụ 6).
Một điều khác nữa là: Nếu bạn chờ các phân đoạn CDATA, bạn sẽ phải kiểm tra trình duyệt của bạn
chấp nhận phương thức supportsCDATASection() hay không; Nếu không, thay vào đó các phân
đoạn sẽ tạo ra các nút. Kiểm tra tài liệu GWT (Xem Tài nguyên) để biết thêm thông tin.
Ví dụ 6. XMLParser cung cấp việc đọc và tạo ra XML trong GWT
protected void loadCities(final String xmlCities) {
...
final Document xmlDoc= XMLParser.parse(xmlCities);
final Element root= xmlDoc.getDocumentElement();
XMLParser.removeWhitespace(xmlDoc);
final NodeList cities= root.getElementsByTagName("city");
for (int i= 0; i < cities.getLength(); i++) {
final Element city= (Element)cities.item(i);
// show city.getAttributeNode("name").getValue()
final Element country= (Element)city.getElementsByTagName("country").item(0);
// show country.getAttributeNode("code").getValue()
// show country.getAttributeNode("name").getValue()
...
final Element population= (Element)city.getElementsByTagName("pop").item(0);
if (population != null) {
// show population.getFirstChild().getNodeValue()
}
final Element coords= (Element)city.getElementsByTagName("coords").item(0);
final Element lat= (Element)coords.getElementsByTagName("lat").item(0);
// show lat.getFirstChild().getNodeValue()
...
}
...
Bạn có thể lấy lại các phần tử (giống như city trong ví dụ này) bằng cách sử dụng phương thức
getElementsByTagName() và từng bước đi vào các mảng kết quả. Cách duy nhất là sử dụng
phương thức getFirstChild(), sau đó đi đến phần còn lại của các phần tử cùng cấp bằng
phương thức getNextSibling(). Để lấy các thuộc tính theo yêu cầu, đầu tiên dùng phương thức
getAttributeNode(), sau đó là phương thức getValue(). Các phương pháp này xử lý các phân
đoạn CDATA, các chú giải và tất cả các thành phần có thể có của XML.
XML: Cầu nối giữa GWT và PHP
Trang 8 của 14
ibm.com/developerWorks/vn/
developerWorks®
Gửi XML với GWT
Ứng dụng GWT giúp người dùng chỉnh sửa các trường dân số, kinh độ và vĩ độ, sau đó gửi dữ liệu
các thành phố đến máy chủ để cập nhật dữ liệu. Hai thuật toán được sử dụng là: thuật toán đơn
giản hơn thì xây dựng dòng lệnh XML từng phần và thuật toán dựa trên XMLParser sử dụng các
phương thức đặc trưng để tạo ra cấu trúc mong muốn.
Thuật toán đơn giản hơn được chỉ ra trong phương thức getCities1(). Bạn có thể sử dụng cả hai
đối tượng String hoặc StringBuffer để tạo XML. Tôi sử dụng cách này, bởi vì nó tạo ra đoạn mã
rõ ràng; nhưng khi thi hành, thuật toán thứ hai hoạt động tốt hơn. Cùng với các vấn đề về các ký
tự lớn hơn, nhỏ hơn,... bạn có thể xem phiên bản sử dụng PHP dưới đây, đoạn mã này sử dụng
phương thức Html.htmlspecialchars() để giải quyết vấn đề đó. (Xem Ví dụ 7, đã được chỉnh sửa
một chút cho rõ ràng hơn.)
Ví dụ 7. Xây dựng XML từng phần từ các chuỗi ký tự đơn giản
protected String getCities1() {
String result= "";
result+= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
result+= "<cities>\n";
for (all rows in the grid) {
// get cityName, countryCode, regionCode, pop, lat, and lon, from the grid
result+= " <city name=\"" + Html.htmlspecialchars(cityName) + "\">\n";
result+= " <country code=\"" + countryCode + "\"/>\n";
result+= " <region code=\"" + regionCode + "\"/>\n";
if (!pop.equals("0") && !pop.isEmpty()) {
result+= " <pop>" + pop + "</pop>\n";
}
result+=
result+=
result+=
result+=
result+=
" <coords>\n";
"
<lat>" + lat + "</lat>\n";
"
<lon>" + lon + "</lon>\n";
" </coords>\n";
"</city>\n";
}
result+= "</cities>\n";
return result;
}
Thuật toán đơn giản khác để tạo XML là phương thức createDocument() của lớp XMLParser. Cách
này gợi lại các hàm SimpleXML trong PHP, đầu tiên bạn tạo một tài liệu rỗng, sau đó thêm các
phần tử vào tài liệu đó. Bạn có thể tạo tất cả các loại của các nút cũng giống như cách thiết lập
thuộc tính các giá trị. Cuối cùng, sử dụng phương thức Java chuẩn toString() tạo ra đại diện của
đối tượng; bạn chỉ cần thêm khai báo phiên bản và các dòng mã lệnh, sau đó bạn sẽ có dòng lệnh
như yêu cầu. (Xem Ví dụ 8, đã được chỉnh sửa và rút gọn cho thêm rõ ràng.)
Ví dụ 8. Các phương thức XMLParser để tạo XML tương tự với các phương thức
SimpleXML trong PHP
protected String getCities2() {
Document xml= XMLParser.createDocument();
Element cities= xml.createElement("cities");
xml.appendChild(cities);
XML: Cầu nối giữa GWT và PHP
Trang 9 của 14
developerWorks®
ibm.com/developerWorks/vn/
for (all rows in the grid) {
// get cityName, countryCode, regionCode, pop, lat, and lon, from the grid
Element city= xml.createElement("city");
city.setAttribute("name", cityName);
Element country= xml.createElement("country");
country.setAttribute("code", countryCode);
city.appendChild(country);
...
if (!pop.equals("0") && !pop.isEmpty()) {
Element popEl= xml.createElement("pop");
Text popText= xml.createTextNode(pop);
popEl.appendChild(popText);
city.appendChild(popEl);
}
Element coords= xml.createElement("coords");
Element lat= xml.createElement("lat");
Text latText= xml.createTextNode(lat);
lat.appendChild(latText);
coords.appendChild(lat);
...
city.appendChild(coords);
cities.appendChild(city);
}
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xml.toString();
}
Đọc tài liệu XML trong PHP
Xử lý XML trong PHP là một vấn đề cũ, vấn đề này có rất ít giải pháp. Tuy nhiên, theo ý kiến
chủ quan của tôi, không có giải pháp nào gần với SimpleXML xét theo khía cạnh rõ ràng và
ngắn gọn. Về cơ bản, bạn tạo một đối tượng PHP bằng cung cấp tài liệu XML đến phương thức
simplexml_load_string(), sau đó lấy kết quả bằng cách sử dụng các toán tử chuẩn PHP. Các
thuộc tính trở thành các phần tử của các mảng (xem cách mã nước được đọc trong Ví dụ 9), và các
phần tử có thể được truy cập như là một mảng (bằng cách sử dụng phương thức children()) nó
giống như truy cập trực tiếp các thuộc tính của đối tượng.
Ví dụ 9. SimpleXML là phương thức dễ nhất xử lý tài liệu XML trong PHP
$xml_str= $_POST["xmldata"];
$xml_obj= simplexml_load_string($xml_str);
...
foreach($xml_obj->children() as $city) {
$name= addslashes($city['name']);
$country= $city->country['code'];
$region= $city->region['code'];
$pop= $city->pop;
$lat= $city->coords->lat;
$lon= $city->coords->lon;
mysql_query("REPLACE INTO cities ".
"(cityName, countryCode, regionCode, population, latitude, longitude) VALUES (".
"'{$name}', '{$country}', '{$region}', '{$pop}', '{$lat}', '{$lon}')");
}
Có rất nhiều cách để xử lý XML với PHP. Hãy kiểm tra mục Tài nguyên để có các đường dẫn hữu
ích.
XML: Cầu nối giữa GWT và PHP
Trang 10 của 14
ibm.com/developerWorks/vn/
developerWorks®
Kết luận
Tôi vừa mới thảo luận qua bề nổi giống như bao nhiêu cách bạn có thể sử dụng XML như là một
cầu nối giữa GWT và PHP, nhưng với các phương thức đã đề cập có lẽ là đủ giúp bạn bắt đầu. Điều
bạn nên nhớ là GWT không có giới hạn khi sử dụng phương thức RPC của chính nó và nó có thể
cũng chung sống hạnh phúc với XML, hãy thoải mái tạo ra và sử dụng các tài liệu như thế.
XML: Cầu nối giữa GWT và PHP
Trang 11 của 14
developerWorks®
ibm.com/developerWorks/vn/
Các tải về
Mô tả
Tên
Mã nguồn Java cho bài viết này
Kích thước
java_source_code.zip
4KB
Mã nguồn PHP cho bài viết này
php_source_code.zip
4KB
XML: Cầu nối giữa GWT và PHP
Trang 12 của 14
ibm.com/developerWorks/vn/
developerWorks®
Tài nguyên
Học tập
• Nghiên cứu thêm về XML tại địa chỉ W3C XML site: Xem thêm ở documentation, bao gồm
phiên bản mới nhất (ấn bản thứ 5) của XML chuẩn.
• Xử lý XML trong PHP: Khám phá một số phương pháp đặc biệt —, SimpleXML, XMLReader,
và XMLWriter, như đã được sử dụng trong bài viết này.
• Lớp XMLParser: Các tài liệu ngiên cứu về GWT.
• JSON.org: Sự thú vị trong JSON như là xem kẽ với XML? Tìm các tài nguyên cho hầu hết các
ngôn ngữ lập trình hiện đại, bao gồm cả ngôn ngữ Java và PHP.
• chính sách cùng nguồn (SOP): Nghiên cứu hơn nữa, xem thêm giải pháp tận gốc cho vấn đề
SOP và xem thêm các cân nhắc ở đó.
• Chứng chỉ IBM XML: Chỉ cho bạn cách trở thành nhà phát triển về XML cũng như các kỹ thuật
liên quan được IBM chứng nhận.
• Thư viện kỹ thuật XML: Xem vùng developerWorks XML về các bài viết và các chỉ dẫn, các
bài học, các tiêu chuẩn và IBM Redbooks.
• Các sự kiện kỹ thuật developerWorks và các cuộc truyền hình trên Web: Các công nghệ hiện
nay.
• technology bookstore: Các cuốn sách về kỹ thuật.
• developerWorks podcasts: Nghe các bài phỏng vấn và các thảo luận thú vị với các nhà phát
triển phần mềm.
Lấy sản phẩm và công nghệ
• Google Web Toolkit: Tải về và thử nghiệm các ví dụ mẫu bao gồm cả các ví dụ trong bài viết
này.
• khung làm việc PEAR: Kiểm tra để sử dụng lại các thành phần PHP.
• MaxMind's bảng các thành phố: Tải về và cũng có thể tìm những liên kết đến dữ liệu các quốc
gia và các vùng miền.
• Các phiên bản thử nghiệm sản phẩm IBM: Tải về hoặc khám phá bản thử nghiệm trực tuyến tại
IBM SOA Sandbox và tiếp cận các công cụ phát triển ứng dụng và các sản phẩm trung gian
từ DB2®, Lotus®, Rational®, Tivoli®, and WebSphere®.
Thảo luận
• Các diễn đàn thảo luận về XML: Tham gia đóng góp trong bất cứ thảo luận nào về XML.
• developerWorks blogs: Xem các blog và tham gia cộng đồng developerWorks.
XML: Cầu nối giữa GWT và PHP
Trang 13 của 14
developerWorks®
ibm.com/developerWorks/vn/
Đôi nét về tác giả
Federico Kereki
Federico Kereki là một kỹ sư hệ thống người Uruguay với hơn 20 năm kinh nghiệm
phát triển hệ thống, ông làm công việc cố vấn và giảng dạy ở các trường đại học. Hiện
nay, Ông làm việc với: SOA, GWT, Ajax, PHP và tất nhiên cả FLOSS
© Copyright IBM Corporation 2009
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
XML: Cầu nối giữa GWT và PHP
Trang 14 của 14