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

pdf8 trang | Chia sẻ: lylyngoc | Lượt xem: 1635 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Giới thiệu MicroXML, Phần 2: Xử lý MicroXML bằng MicroLark, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 Welcome page Welcome to IBM developerWorks. 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 Hello, I claim to be MicroXML 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=""> Copia 2005-07-15T12:00:00Z Uche Ogbuji XHTML tutorial pubbed 2005-07-15T12:00:00Z "XHTML, step-by-step" Start working with Extensible Hypertext Markup Language. In this tutorial, author Uche Ogbuji shows you how to use XHTML in practical Web sites. In this tutorial Tutorial introduction Anatomy of an XHTML Web page Understand the ground rules Replace common HTML idioms Some practical considerations Wrap up 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: