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

Giới thiệu MicroXML, Phần 2: Xử lý MicroXML bằng MicroLark pot

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 (120.2 KB, 8 trang )

Giới thiệu MicroXML, Phần 2: Xử lý MicroXML
bằng MicroLark
MicroXML, bản đơn giản hóa tương thích 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ế
nào. MicroXML đã được James Clark đề xuất và được John Cowan nâng cao, ông cũng đã tạo ra
trình 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à thực hiện một số chế độ phân tích cú pháp: 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 phá 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 lệnh và mã
mẫu.
Bắt đầu
Để làm theo các ví dụ trong bài viết này, bạn cần phải 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 dịch Jython mã nguồn mở
Bạn có thể bắt đầu bằng cách chạy MicroLark trên dòng lệnh với tập tin MicroXML như là đầu
và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="
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

-IBM developerWorks
)a

)p
-\n
-
)body
-\n
)html

Có phải nó trông hơi lạ? Liệt kê 3 có định dạng được gọi là PYX, biểu 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 diễn các tài liệu SGML. PYX biểu hiện tất cả các
thông tin trong tài liệu XML theo cách giảm 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 vấn đề của XML: Giới thiệu PYX" trong phần Tài nguyên.)
Định dạng PYX là cực kỳ đơn giản. Ký tự đầu tiên trên mỗi dòng xác định kiểu nội dung của
dòng. Nội 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 thuộc 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

thấy các ký tự tiề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.
Xử lý lỗi
Như với bất kỳ trình phân tích cú pháp XML hoặc MicroXML nào, điều quan trọng là hiểu
những gì xảy ra trong trường hợp đầu vào có lỗi. Liệt kê 5 là ví dụ về XML không đúng khuôn
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 chạy 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
lỗi khi gặp thẻ không khớp. Đầu ra chỉ rõ hàng và cột của tập tin nguồn, nơi lỗi xảy ra.
Về đầu trang
API trình phân tích cú pháp
Hầu hết người dùng sẽ muốn gắn bó chặt chẽ hơn vào trình phân tí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, một công cụ tạo
sản phẩm mẫu ban đầu xuất sắc. Jython là bản triển khai thực hiện bằng ngôn ngữ Python, tạo ra
và có thể thực thi mã byte Java. Jython cho phép bạn tương tác với các lớp Java và các API bằng
cách sử dụng một 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 giản cho XML (SAX) thì bạn đã quen thuộc với giao diện
đẩy. Để sử dụng giao diện đẩ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ử, thuộc tính và dữ liệ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 gồm 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à gọi 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 xử lý nội dung chuyên dùng
Thông thường, bạn sẽ muốn cung cấp lớp trình xử lý nội dung của chính bạn, làm một cái gì đó
chuyên biệt hơn. Liệt kê 9 định nghĩa lớp link_finder kiểm tra từng phần tử để xem liệu nó là có
phải là phần tử a (một liên kết kiểu HTML) hay không. Sau đó trình xử lý nội dung in ra giá trị
của thuộc tính href.

Liệt kê 9. Trình xử lý 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ẽ thấy liên kết duy nhất trong tài liệu, đến địa chỉ:

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 một mẩu tài
liệu tại một thời điểm và sử dụng phương thức tiện ích để làm việc với các sự kiện đạ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.
Trình xây dựng cây
Bạn cũng có thể sử dụng MicroLark để xây dựng cây tương tự như của mô hình đối tượng tài
liệu (Document Object Model -DOM). Để làm như vậy, hãy sử dụng phương thức buildTree()
của đối tượng trình phân tích cú pháp.
Về đầu trang
Trình diễn
Phần 1 đã giải thích cách MicroXML duy trì việc nhận biết không gian tên của XML trong khi
đơn giản hóa vấn đề càng nhiều càng tốt. MicroLark theo vết các không gian tên gắn với bất kỳ
phần tử hoặc thuộc tính nào, và bạn có thể truy cập với các phương thức getNamespace và
getAttributeNamespace. Không còn những việc vô nghĩa với các tiền tố và qnames (tên đầy đủ
phân biệt). Liệt kê 11 là một chương trình đơn giản để phân tích tệp tin và báo hiệu mỗi khi bắt
gặp không gian tên mặc định mới.

Liệt kê 11. Gặp phải không gian tên mặc định

from org.ccil.cowan.microlark import Parser
from java.lang import System

p = Parser()

#Start the pull parse
p.parse(System.in)

event = None
current_namespace = 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()
#Has the namespace changed?
if elem.getNamespace() != current_namespace:
current_namespace = elem.getNamespace()
#Print the new namespace
print "Entering default namespace: ", current_namespace

Liệt kê 12 là tài liệu Atom ví dụ mẫu theo định dạng MicroXML. Không gian tên mặc định được
đặt là Atom cho phần tử feed và đặt là XHTML cho phần tử div.

Liệt kê 12. Tài liệu Atom ví dụ mẫu

<feed xmlns="
xml:lang="en"
xml:base="">
<id>
<title>Copia</title>
<updated>2005-07-15T12:00:00Z</updated>
<author>
<name>Uche Ogbuji</name>
<uri></uri>
</author>
<link href="/blog" />
<link rel="self" href="/blog/atom1.0" />
<entry>

<id>
<title>XHTML tutorial pubbed</title>
<link href="
<category term="xml"/>
<category term="css"/>
<category term="xhtml"/>
<updated>2005-07-15T12:00:00Z</updated>
<content type="xhtml">
<div xmlns="
<p>
<a href="
"XHTML, step-by-step"
</a>
</p>
<blockquote>
<p>Start working with Extensible Hypertext Markup Language. In this
tutorial,
author Uche Ogbuji shows you how to use XHTML in practical Web
sites.</p>
</blockquote>
<p>In this tutorial</p>
<ul>
<li>Tutorial introduction</li>
<li>Anatomy of an XHTML Web page</li>
<li>Understand the ground rules</li>
<li>Replace common HTML idioms</li>
<li>Some practical considerations</li>
<li>Wrap up</li>
</ul>
</div>

</content>
</entry>
</feed>

Ghi lưu tệp tin trong liệt kê 11 thành tệp listing7.py và tệp tin trong liệt kê 12 thành tệp
listing8.xml. Cho chạy chúng bằng Jython. Bạn sẽ nhận được đầu ra trong liệt kê 13.

Liệt kê 13. Đầu ra

>$ jython -Dpython.path=microlark.jar listing7.py < listing8.xml
Entering default namespace:
Entering default namespace:

×