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

Thử nghiệm với trình phân tích cú pháp MicroXML tiên phong

MicroXML là bản đơn giản tương thích lùi của XML. Phần 1 của loạt bài viết này đã bàn về các nguyên tắc cơ bản của MicroXML. MicroXML được thiết kế bằng các cú pháp đơn giản có thể được xử lý với nhiều công cụ phân tích cú pháp hiện đại phổ dụng. John Cowan đã phát triển MicroLark, một trình phân tích cú pháp MicroXML mã nguồn mở trong môi trường Java. Trong bài viết này, hãy sử dụng đoạn mã ví dụ để học MicroLark.

Uche Ogbuji, Tư vấn trưởng

Uche Ogbuji là một tư vấn viên và là người đồng sáng lập của Fourthought Inc., một hãng bán và tư vấn phần mềm chuyên về các giải pháp XML cho quản lý tri thức doanh nghiệp. Fourthought phát triển 4Suite, một nền tảng mã nguồn mở cho XML, RDF, và các ứng dụng quản lý tri thức. Ông Ogbuji cũng là một nhà phát triển hàng đầu của ngôn ngữ truy vấn Versa RDF. Ông là một kỹ sư máy tính kiêm nhà viết sách sinh ra ở Nigeria, sống và làm việc ở Boulder, Colorado, USA. Bạn có thể liên hệ với ông Ogbuji theo địa chỉ uche@ogbuji.net.



31 10 2012

Tổng quan

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="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

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.


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ỉ: 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 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.


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="http://www.w3.org/2005/Atom"
      xml:lang="en"
      xml:base="http://copia.ogbuji.net">
  <id>http://copia.ogbuji.net/atom1.0</id>
  <title>Copia</title>
  <updated>2005-07-15T12:00:00Z</updated>
  <author>
    <name>Uche Ogbuji</name>
    <uri>http://uche.ogbuji.net</uri>
  </author>
  <link href="/blog" />
  <link rel="self" href="/blog/atom1.0" />
  <entry>
    <id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</id>
    <title>XHTML tutorial pubbed</title>
    <link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
    <category term="xml"/>
    <category term="css"/>
    <category term="xhtml"/>
    <updated>2005-07-15T12:00:00Z</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.htm">
            "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:  http://www.w3.org/2005/Atom
Entering default namespace:  http://www.w3.org/1999/xhtml

Tổng kết

Đặc tả không có nghĩa nhiều nếu không có triển khai thực hiện thực tế. Điều quan trọng là có ai đó thúc đẩy và thực hiện MicroXML. John Cowan là người dẫn đầu với MicroLark. Phần lớn, MicroLark rất dễ hiểu, đặc biệt là trong khung công tác nhẹ của Jython. Hy vọng rằng bây giờ bạn có mọi thứ cần thiết để bắt đầu thử nghiệm với MicroXML.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=843741
ArticleTitle=Giới thiệu MicroXML, Phần 2: Xử lý MicroXML bằng MicroLark
publish-date=10312012