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.
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,
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ả.
Hình 2. Kết quả tìm kiếm các thành phố cùng với tên "Darwin"
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:
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");
|
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!
Ứ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 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'].'" ';
echo 'name="'.htmlentities($row['regionName']).'"/>'."\n";
echo ' <coords>'."\n";
echo ' <lat>'.$row['latitude'].'</lat>'."\n";
echo ' <lon>'.$row['longitude'].'</lon>'."\n";
echo ' </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 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.)
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.
Ứ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+= " <coords>\n";
result+= " <lat>" + lat + "</lat>\n";
result+= " <lon>" + lon + "</lon>\n";
result+= " </coords>\n";
result+= "</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);
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();
}
|
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.
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ế.
| Mô tả | Tên | Kích thước | Phương thức tải |
|---|---|---|---|
| Mã nguồn Java cho bài viết này | java_source_code.zip | 4KB | HTTP |
| Mã nguồn PHP cho bài viết này | php_source_code.zip | 4KB | HTTP |
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.