Giới thiệu MicroXML, Phần 2: Xử lý MicroXML
bằng MicroLark
MicroXML, bản đơn gin hóa tương tch lùi của XML, là đặc tả mới nổi lên. Trong phần 1 của
loạt bài viết này, hãy khám phá các nguyên tắc cơ bản của MicroXML, bạn đã học được những
khái niệm cơ sở của MicroXML và nó khác với XML 1.x và các tiêu chuẩn liên quan như thế
o. MicroXML đã được James Clark đề xuất và được John Cowan nâng cao, ông cũng đã to ra
tnh phân tích cú pháp đầu tiên của nó là MicroLark. MicroLark là mã nguồn mở (giấy phép
Apache 2.0), được viết bằng ngôn ngữ Java và thc hiện một số chế độ phân tích cú pp: chế độ
kéo, chế độ đẩy và chế độ cây.
Trong bài viết này, hãy học về phân tích đnh dạng MicroXML. Hãy khám p những khía cạnh
khác nhau của API của trình phân tích cú pháp MicroLark bằng cách sử dụng dòng lnh và
mẫu.
Bắt đầu
Để làm theo các dụ trong bài viết này, bạn cần phi tải về (xem phần Tài nguyên):
microLark.jar, hoặc mã nguồn nếu bạn thích
Trình thông dch Jython mã nguồn m
Bạn có thbắt đầu bằng cách chạy MicroLark trên dòng lệnh vi tập tin MicroXML như là đầu
o. Liệt kê 1 là một thay đổi nhỏ của tập tin đơn giản từ phần 1.
Liệt kê 1. Tập tin đơn giản
<!DOCTYPE html>
<html lang="en">
<!-- A comment -->
<head>
<title>Welcome page</title>
</head>
<body>
<p>Welcome to <a href="http://ibm.com/developerworks/">IBM
developerWorks</a>.</p>
</body>
</html>
Ghi lưu mẫu ở trên là listing1.xml và đưa nó nào MicroLark bằng cách sử dụng mã trong liệt kê
2.
Liệt kê 2. MicroLark
java -jar microlark.jar listing1.xml
Bạn sẽ nhận được đầu ra trong liệt kê 3.
Liệt kê 3. Đầu ra
(html
Alang en
-\n
-
-\n
-
(head
-\n
-
(title
-Welcome page
)title
-\n
-
)head
-\n
-
(body
-\n
-
(p
-Welcome to
(a
Ahref
http://ibm.com/developerworks/
-IBM developerWorks
)a
-.
)p
-\n
-
)body
-\n
)html
phi nó trông hơi lạ? Liệt kê 3 có định dạng được gọi là PYX, biu diễn theo dòng của các tài
liệu XML, cũng dẫn xuất từ quy ước biểu din các tài liệu SGML. PYX biểu hiện tt cả các
thông tin trong tài liu XML theo cách gim thiểu gánh nặng phân tích cú pháp. Đây là công c
cực k hữu ích mà rất đáng buồn là nó b các nhà phát triển XML bỏ rơi.
Hoạt đng mặc định của MicroLark là chuyển đổi tài liệu MicroXML sang PYX, hay đúng hơn
là tập hợp con của PYX, dựa trên thực tế là MicroXML là tập hợp con của XML. (Để biết thêm
v PYX, đọc "Các vn đề của XML: Giới thiệu PYX" trong phần i nguyên.)
Định dạng PYX là cực k đơn giản. Ký tự đầu tiên trên mi dòng xác đnh kiểu nội dung của
dòng. Ni dung không trực tiếp lan trên nhiều dòng, mặc dù các dòng kế tiếp nhau có thể chứa
cùng kiểu nội dung. Trong trường hợp các thuộc tính của thẻ, tên thuc tính và giá trị chỉ đơn
giản được tách ra bởi khoảng trắng, mà không cần sử dụng thêm dấu ngoặc kép. Liệt kê 4 cho
thy các ký ttiền tố.
Liệt kê 4. Các ký tự tiền tố
( start-tag
) end-tag
A attribute
- character data (content)
? processing instruction
Chú giải tương ứng với đầu vào ở trên. Vẻ đẹp của PYX là nó có thđược sử dụng với các lệnh
xử lý văn bản luôn hữu ích và có từ lâu của UNIX như grep, awk, sort, sed, awk vân vân.
Xlý li
Như với bất kỳ trình phân ch cú pháp XML hoặc MicroXML nào, điều quan trng là hiểu
những gì xảy ra trong trường hợp đầu vào li. Liệt kê 5 là ví dụ về XML không đúng khn
dạng từ Phần 1.
Liệt kê 5. XML không đúng khuôn dạng
<para>Hello, I claim to be <strong>MicroXML</para>
Nếu bạn ghi lưu liệt kê trên thành tệp badxml.xml và cho chy nó qua MicroLark, bạn nhận được
đầu ra trong liệt kê 6.
Liệt kê 6. Xử lý lỗi
$ java -jar microlark.jar badxml.xml
(para
-Hello, I claim to be
(strong
-MicroXML
!1:50:Unexpected end-tag
MicroLark bắt đầu bằng cách phát ra các dòng PYX và sau đó dừng lại đột ngột với thông báo
li khi gặp thkhông khớp. Đầu ra chỉ rõ hàng và cột của tập tin nguồn, nơi li xy ra.
Về đầu trang
API tnh phân tích cú pháp
Hầu hết người dùng smuốn gắn bó chặt chẽ hơn vào trình phân ch cú pháp MicroLark. Để
làm như vậy mà không đi quá sâu vào mã Java phức tạp, bạn sẽ sử dụng Jython, mt công cụ tạo
sản phẩm mẫu ban đầu xuất sắc. Jython là bn triển khai thực hin bng ngôn ngữ Python, to ra
có thể thực thi mã byte Java. Jython cho phép bạn tương tác vi các lớp Java và các API bằng
cách sử dụng mt ngôn ngữ đơn giản hơn nhiều.
Trình phân tích cú pháp đẩy
Nếu bạn đang quen thuộc với API đơn gin cho XML (SAX) thì bạn đã quen thuc vi giao diện
đẩy. Để sử dụng giao din đẩy của MicroLark, bạn cung cấp cho một lớp các phương thức rất
giống SAX để xử lý các cấu kiện khác nhau như các phần tử, thuc tính và dliệu ký tự. Hãy s
dụng giao diện ContentHandler để cung cấp lớp này. MicroLark có một vài lớp tiện ích với giao
diện đó, bao gm cả PyxWriter, lớp này tạo ra PYX như trong liệt kê 3.
Liệt kê 7 là chương trình Jython đơn giản để lặp lại hoạt đng của dòng lệnh cơ bản của
MicroLark.
Liệt kê 7. PYX
from org.ccil.cowan.microlark import PyxWriter, Parser
from java.lang import System
pw = PyxWriter(System.out)
f = open(System.in)
p = Parser()
p.parse(f, pw)
Ghi lưu đầu ra trên là listing4.py và gi thực hiện như trong liệt kê 8.
Liệt kê 8. Gọi thực hiện mẫu
jython -Dpython.path=microlark.jar listing3.py < listing1.xml
Trình xlý ni dung chuyên dùng
Thông thường, bạn sẽ muốn cung cấp lớp trình x ni dung của chính bạn, làm mộti gì đó
chuyên biệt hơn. Liệt kê 9 định nghĩa lớp link_finder kim tra từng phn tử để xem liệu nó là
phải là phần tử a (một liên kết kiểu HTML) hay không. Sau đó trình xlý ni dung in ra giá trị
của thuộc tính href.
Liệt kê 9. Trình xlý chuyên dùng
from org.ccil.cowan.microlark import ContentHandler, Parser
class link_finder(ContentHandler):
def startElement(self, elem):
if elem.getName() == u'a':
print elem.getAttributeValue(u'href')
f = open('listing1.xml')
p = Parser()
p.parse(f, link_finder())
Nếu bạn chạy mã trong liệt kê 9, bạn sẽ thy liên kết duy nhất trong tài liệu, đến địa chỉ:
http://ibm.com/developerworks/.
Trình phân tích cú pháp kéo
Một cách tiếp cận khác để phân tích cú pháp là phương thức kéo, ở đây bạn yêu cầu mt mẩu tài
liệu tại mt thời điểm và sử dụng phương thức tin ích để làm việc với các sự kin đại diện cho
các thẻ phần tử hoặc nội dung. Liệt kê 10 sử dụng các API kéo để xử lý tệp tin rất tương tự như
phiên bản đẩy trong liệt kê 7.
Liệt kê 10. API kéo
from org.ccil.cowan.microlark import Parser
f = open('listing1.xml')
p = Parser()
#Start the pull parse
p.parse(f)
event = None
#Run through all the events in the document
while event != p.END_DOCUMENT:
#Pull the next event
event = p.next()
#Is it an element start tag?
if event == p.START_ELEMENT:
#Get the element's information
elem = p.getElement()
#Is it an a element?
if elem.getName() == u'a':
#Then print the link value
print elem.getAttributeValue(u'href')
Liệt kê này được chú thích theo phong cách tự do để hướng dẫn bạn hiểu được logic. Đầu ra là
giống như đầu ra từ liệt kê 7.