Cài đặt cây chú thích TA,D

Một phần của tài liệu luận văn: tìm hiểu và so sánh một số kỹ thuật nén XML (Trang 48)

Khái niệm chu trình

Một tài liệu D có một chu trình nếu tồn tại một node n trong D mà có hai con x và y của n thỏa mãn điều kiện x<y và y<x trong đó, “<” biểu thị thứ tự xuất hiện . Nếu có chu trình thì phải thêm tên thẻ giả dummy tag ký hiệu “$” vào trong cây chú thích TA,D để

tránh các chu trình. Khi thực hiện quá trình giải nén, các node giả này sẽ được loại bỏ bởi bộ giải nén để tái tạo lại tài liệu gốc ban đầu.

Các chu trình có thể xảy ra trong hai trường hợp sau:

1. Node NA xuất hiện node NB và sau đó NA xuất hiện sau NB, trong đó NA và NB có cùng node cha. Ví dụ 3.19 sau đây minh họa trường hợp này.

Ví dụ 3.19: Minh họa tài liệu D có chu trình xảy ra. <parent>

<a></a> <b></b> <a></a> </parent>

2. NA xuất hiện trước NB và cả hai đều là con của Nparent1 Sau đó, NB xuất hiện trước NAvà cả hai đều là con của Nparent2, trong đó Nparent1 và Nparent2 có cùng đường dẫn ví dụ, chúng có cùng tổ tiên trong cây khung . Ví dụ 3.20 sau đây minh họa trường hợp này.

Ví dụ 3.20: Minh họa tài liệu D chứa một chu trình đơn giản như sau <super_parent> <parent> <a></a> <b></b> </parent> <parent> <b></b> <a></a> </parent> </super_parent>

Hình 3.11: Biểu diễn cây chú thích của tài liệu D có thêm các node giả “$” [20]

Hình 3.12: Khôi phục lại cây tài liệu D với các node giả “$” [20] Thuật toán 3.1

Đầu vào: Tài liệu XML D.

Đầu ra: Cây được chú thích TA,D.

Các ký hiệu sau đây được sử dụng trong quá trình xây dựng cây tài liệu được chú thích: 1. ann $ +=1 có nghĩa là nếu chú thích của $ kết thúc với “,” thì thêm “1,”; nếu

không thêm “,”.

2. ann x += 1 cho chú thích khác $ : nếu chú thích kết thúc với “,” thì thêm “0,”; nếu không thêm “,”.

3. Có một bảng T, mỗi d ng row có 3 đầu vào: một đường dẫn đầy đủ, một đồ thị được kết hợp với đường dẫn và một chú thích cho “$” đầu vào có thể rỗng . 4. “close absolute path p ”: mỗi node x trong đồ thị được kết hợp với đường dẫn p

thực hiện ann x +=1 và nếu đường dẫn p có một chú thích không rỗng cho “$” thì sau đó thực hiện ann $ +=1.

5. “cycle x ”: x đang là node hiện thời và thêm x vào đồ thị sẽ tạo ra một chu trình ví dụ nêú có đồ thị a ← b sau đó thêm vào node a thì sẽ ra một chu trình a ← b ← a .

Phương thức: Các phần tử được thêm vào trong cây được chú thích khi chúng được quét qua lần đầu tiên. Thuật toán sử dụng một SAX duy nhất cho tài liệu D và thực hiện các bước sau:

1. Đi lên từ node x đến y; nếu x là con cuối cùng ngoài cùng bên phải của y thì bước tiếp theo sẽ đi lên đến cha mẹ của y sau đó close x và loại bỏ thiết lập node hiện tại trong đồ thị.

2. Đi xuống node x:

- Thêm x vào đồ thị.

- Nếu một chu trình được tạo ra thì close x , sau đó thêm 1 vào ann x và tăng 1 cho chú thích của $ nếu chú thích không tồn tại hoặc kết thúc bằng “,”, sau đó tạo mới và khởi tạo giá trị của nó bắt đầu với 2 .

- Nếu không có chu trình tạo ra, sau đó thêm x vào trong đồ thị một node mới hoặc tăng chú thích của x đã tồn tại và thiết lập x là node hiện thời trong đồ thị.

3. Sau khi hoàn thành, kiểm tra các chú thích và thêm số “0” ở đầu cho các node chính và thêm “1” cho các node giả node $ .

Ví dụ 3.21: Xem xét cây tài liệu D được minh họa trong hình 3.13. Ta thấy, có sử dụng chỉ số cho các node ví dụ a1, a2, a3… là a; b1, b2, b3… là b; s1, s2, s3… là s; t1, t2, t3… là t; z1, z2 là z; x1, x2, x3 là x; y1, y2, y3 là y; u1, u2 là u.

Hình 3.13: Biểu diễn một tài liệu D sẽ được áp dụng thuật toán 3.1 [20]

Bảng 3.3 biểu diễn các bước thực hiện chính trong quá trình tạo mới một cây chú thích của tài liệu D trong hình 3.13. Mỗi bước mô tả quá trình xác định một node khi SAX quét qua, sau đó thay đổi đường dẫn path , đồ thị graph của nó và chú thích của $ nếu chú thích đã

tồn tại . Node hiện thời được in đậm. Ví dụ xem xét đường dẫn và đồ thị /r, a[1] chỉ ra rằng đồ thị có chứa một node a, node này được gán nhãn bởi 1 cho đường dẫn /r.

ảng 3.3: Mô tả các bước thực hiện thuật toán 3.1 khi tạo mới cây chú thích của tài liệu D trong hình 3.13 [20] Bước # Hành động Các chú thích $ 1 Root r Graph /r 2 a1 (/r, a[1]) (/r/a, empty) 3 s1 (/r/a, s[1])

4 Đi lên a1; close /r/a , loại bỏ thiết lập hiện thời

(/r/a, s[1,]

5 Đi đến b1, thêm một node mới b to vào đồ thị cho /r và một cạnh giữa b và a

(/r, a[1]<- b[1])

6 Đi đến t1 (r/b/, t[1])

7 Đi đến x1 (/r/b/t, x[1])

8 Đi đến y1; cố gắng thêm một cạnh giữa y và x bởi vì x đang là node hiện thời

(/r/b/t, x[1]<-y[1])

9 Đi đến x2: điều này sẽ tạo ra một chu trình.

(/r/b/t, x[1,1]<-y[1,]) $[2]

10 Đi lên t1, không có sự xuất hiện của y Close /r/b/t: không có bất kỳ node hiện thời nào tại thời điểm này.

(/r/b/t, x[1,1,]<-y[1,0,]) $[2,]

11 Đi đến b1, close /r/b/ (/r/b, t[1,])

12 a2: cycle (/r, a[1,1]<-b[1,]) $[2]

13 s2 (/r/a, s[1,1])

14 u1 (/r/a/s, u[1])

15 Đi lên s2: close (/r/a/s, u[1,])

16 s3: (/r/a, s[1,2])

17 w1: đồ thị chứa 2 node bị cô lập bởi vì nó không có node hiện thời ở phía trước

(/r/a/s, u[1,] w[1])

18 u2: không có cycle (/r/a/s, w[1]<-u[1,1]) 19 s3: close (/r/a/s, w[1,]<-u[1,1,])

20 z1 (/r/a, s[1,2]<-z[1])

21 a2: close (/r/a, s[1,2,]<-z[1,])

22 a3 (/r, a[1,2]<-b[1,]) $[2]

24 s4: cycle (/r/a, s[1,2,0,1]<-z[1,1,]) $[2] 25 Close /r/a/s (/r/a/s, w[1,0,]<-u[1,1,0,])

26 Đi lên a3; close (/r/a, s[1,2,0,1,]<-z[1,1,0,]) $[2,]

27 b2: (/r, a[1,2]<-b[1,1]) $[2]

28 t2: (/r/b, t[1,1])

29 Đi lên b2: close (/r/b/t, x[1,1,0,]<-y[1,0,0,]) $[2,1,]

30 Đi lên: close (/r/b, t[1,1,])

31 b3 (/r, a[1,2]<-b[1,2]) $[2]

32 t3 (/r/b/, t[1,1,1])

33 y2 (/r/b/t, x[1,1,0,]<-

y[1,0,0,1])

$[2,1,1]

34 Đi lên: close (/r/b/t, x[1,1,0,0,]<- y[1,0,0,1,]) $[2,1,1,] 35 t4 (/r/b, t[1,1,2]) 36 x3 (/r/b/t, x[1,1,0,0,1]<- y[1,0,0,1,]) $[2,1,1,] 37 y3 (/r/b/t, x[1,1,0,0,1]<- y[1,0,0,1,1]) $[2,1,1,]

38 Đi lên t4: close (/r/b/t,x[1,1,0,0,1,]<- y[1,0,0,1,1,])

$[2,1,1,1, ]

39 Đi lên b3: close (/r/b, t[1,1,2,])

40 a4: cycle (/r, a[1,2,1]<-b[1,2,]) $[3]

41 Kết thúc: close /r/a và sau đó là close /r (/r/a, s[1,2,0,1,0,]<- z[1,1,0,0,])

(/r, a[1,2,1,]<-b[1,2,0,])

$[2,1,] $[3,]

Chú ý:

1 được thêm vào phía trước chú thích của node giả “$”, 0 được thêm vào phía trước chú thích của các node không phải là “$” . Quá trình thêm 1 và 0 khi tạo cây chú thích theo thứ tự để đảm bảo số lượng vị trí trong các chú thích là chính xác. Ví dụ trong hình 3.14, node giả “$” là con của node “a”. Node “a được chú thích bởi [1,2,1] như vậy phải có 4 sự xuất hiện của “$”, tuy nhiên node “$” là con của node “a” chỉ được chú thích bởi [2,1] vậy phải thêm 2 ký tự 1 vào trước [2,1] thành [1,1,2,1]. Node “s” được chú thích là [1,2,1,0,1,0] như vậy phải có 4 sự xuất hiện của node “w” và node “u” hai con của node “s” , tuy nhiên node “w” được chú thích là [1,0] vì vậy hai ký tự 0 được bổ sung thêm vào trước tạo thành một chú thích mới [0,0,1,0]. Tương tự, một ký tự 0 được thêm vào chú thích [1,1,0] của node u, chú thích mới của node u sẽ là [0,1,1,0]. Ký tự 0 cũng được thêm vào trước chú thích [1,1,0,0] tạo nên chú thích mới [0,1,1,0,0] của node z. Cây chú thích hoàn chỉnh của tài liệu D trong hình 3.13 được biểu diễn trong hình 3.15.

Hình 3.15: Biểu diễn cây chú thích hoàn chỉnh của tài liệu D trong hình 3.13 [20]

Hình 3.16 mô tả cây tài liệu được khôi phục từ cây chú thích hoàn chỉnh trong hình 3.15, trong đó các node giả $ không được xóa bỏ. Dễ dàng thấy được, nếu loại bỏ các node giả $ thì sẽ tạo ra cây tài liệu gốc được mô tả trong hình 3.13.

Hình 3.16: Khôi phục lại cây tài liệu D từ cây chú thích TA,D trong hình 3.15 [20] 3.4.4.2. Quá trình giải nén của XSAQCT

Đầu tiên, cây khung skeleton tree TD được chú thích lại để tạo ra cây chú thích TA,D. Sau đó, TA,D được sử dụng để khôi phục lại tài liệu gốc. Bộ chú thích lại reannotator sẽ thực hiện duyệt theo chiều sâu dfs-traversal) cây TD và lấy ra các chú thích từ các container của chúng ví dụ được minh họa trong hình 3.9 bằng cách sử dụng các thuộc tính 2 trong phần 3.4.4.1.1.

3.4.4.2.1. ộ chú thích lại (Reannotator)

Đoạn mã giả cho bộ chú thích lại được mô tả như sau: re-ann(SkeletonTreeNode current) {

for every child c of current {

if(clean(c))

annotate c with “number” of 1’s else

{ // dirty c

fetch “number” digits from Seq and store into the sequence “els” annotate c with “els”

number = sum of all digits in “els” }

re-ann(c) }

number = sum of all digits in the annotation of n }

3.4.4.2.2. ộ phục h i (Restorer)

Bộ phục hồi thực hiện duyệt theo chiều sâu dfs-traversal của cây chú thích TA,D để đưa ra tài liệu D.

Đoạn mã giả cho bộ phục hồi lại được mô tả như sau: re-ann(root of SkeletonTreeNode) output<tag of the root>

d-dfs(root of SkeletonTreeNode) output<\end of tag for the root>

Trong đó, d-dfs được mô tả ở dưới đây bằng cách sử dụng các ký hiệu sau: ann n là số đầu tiên trong chú thích của node n.

chop n trả về kết quả trong quá trình loại bỏ số đầu tiên trong chú thích của node n . dec n giảm 1 số đầu tiên trong chú thích của node n không bao giờ giảm 0 .

LC n và RS n biểu thị con ngoài cùng bên trái nhất và anh chị em bên phải của node n.

Đoạn mã giả của phương thức d-dfs được mô tả như sau: d-dfs(SkeletonTreeNode c) { Node n n= LC(c) while(n <> 0) { if(ann(n)>0) { output “<” + tag_of_n + “>” d-dfs(c) } else chop(n) n = RS(n) } dec(c) output “<\” + tag_of_c + “>” if(ann(c)==0) chop(c) else { output “<” + tag_of_c + “>” d-dfs(c) } }

3.5. EXI

3.5.1. Tổng quan về EXI

EXI (Efficient XML Interchange) được W3C (World Wide Web Consortium) giới thiệu vào năm 2011 và được phát triển bởi Efficient XML Interchange Working Group. EXI là một định dạng XML nhị phân Binary XML dùng để mã hóa các tài liệu XML theo định dạng dữ liệu nhị phân. Định dạng EXI rất nhỏ gọn và có hiệu năng thực thi cao được dùng với mục đích cải thiện năng suất và làm giảm đáng kể các yêu cầu về băng thông mà không ảnh hưởng việc sử dụng hiệu quả các nguồn tài nguyên khác như tuổi thọ pin, kích thước bộ nhớ.

EXI sử dụng phương pháp tiếp cận dựa vào cú pháp grammar-driven để thực hiện quá trình mã hóa. EXI có thể sử dụng các thông tin lược đồ có sẵn để cải thiện tính compact độ chặt và hiệu suất nhưng nó không phụ thuộc vào lược đồ, nó hoạt động hiệu quả ngay cả khi không có bất kỳ lược đồ nào. Định dạng của chính bản thân nó cũng không phụ thuộc vào bất kỳ ngôn ngữ lược đồ riêng nào.

Các lợi ích của EXI, thứ nhất là giảm kích thước tài liệu XML từ đó làm giảm băng thông mạng cũng như không gian lưu trữ, thứ hai là cải thiện tốc độ xử lý mã hóa tài liệu XML và cung cấp một mức độ bảo mật vừa phải khi mã hóa.

EXI được thiết kế xoay quanh năm nguyên tắc chính: tổng quát, tối thiểu, hiệu quả, mềm dẻo và khả năng tương thích.

Tổng quát: định dạng phải hỗ trợ tối đa hóa số lượng hệ thống, thiết bị và ứng dụng mà có thể truyền dữ liệu XML.

Tối thiểu: phải tiếp cận nhiều nhất tập hợp các ứng dụng nhúng, di động, nhỏ bằng cách sử dụng các phương pháp đơn giản.

Hiệu quả: EXI sử dụng các thông tin lược đồ để cải tiến tính compact và quá trình xử lý.

Mềm dẻo: EXI phải mềm dẻo và hiệu quả với các tài liệu mà chứa các phần mở rộng lược đồ tùy ý hoặc sai lược đồ thì sẽ không tạo ra lỗi trong quá trình mã hóa.

Khả năng tương thích: EXI phải tích hợp tốt với các công nghệ XML đã tồn tại, phù hợp với tập thông tin XML XML Information Set hay XMLInfoSet và duy trì khả năng tương tác với các đặc tả XML tương lai.

EXI Stream là cấu trúc cơ bản của tài liệu EXI bao gồm hai thành phần chính: header và body. EXI Header chứa các thông tin meta-data của tài liệu như: phiên bản định dạng format version và các tùy chọn được sử dụng trong quá trình mã hóa. EXI Body chứa một chuỗi các sự kiện event mô tả nội dụng của tài liệu XML gốc.

EXI Header EXI Body

3.5.2. EXI Header

EXI Stream bắt đầu với một EXI Header. EXI Header được dùng để xác định EXI stream, phiên bản định dạng EXI, phân biệt EXI Stream với tài liệu XML văn bản và chỉ ra các tùy chọn được sử dụng để xử lý EXI Body. Cấu trúc của EXI Header được mô tả trong hình 3.18. [EXI Cookie] Distinguishing Bits Presence Bit for EXI Options

EXI Format Version

[EXI options] Padding bits

Hình 3.18: Định dạng EXI Header [6] 3.5.2.1. EXI Cookie

Một EXI Header bắt đầu với EXI Cookie là một trường field 4 bytes, được dùng để phân biệt EXI Stream với các kiểu dữ liệu khác.Trường 4 bytes này chứa 4 ký tự là “$”, “E”, “X” và “I”. EXI Cookie là tùy chọn tuy nhiên nó được khuyến nghị là nên được sử dụng trong header vì EXI Cookie giúp cho quá trình phân biệt EXI với các định dạng tập tin khác dễ dàng hơn.

„$‟ „E‟ „X‟ „I‟

Hình 3.19: EXI Cookie [6] 3.5.2.2. Các bit phân biệt

Các bít phân biệt Distinguishing Bits là một trường bao gồm 2 bit. Bit đầu tiên là 1, bit thứ hai là 0 được mô tả trong hình 3.20 như sau:

1 0

Hình 3.20: Các bit phân biệt (Distinguishing Bits) [6]

Distinguishing Bits là một trường bắt buộc trong EXI Header. Nó được sử dụng để phân biệt EXI Stream với các tài liệu XML văn bản khi EXI Cookie không được thiết lập.

3.5.2.3. it hiện diện cho tùy chọn EXI

Bit hiện diện cho tùy chọn EXI Presence Bit for EXI Options chính là một cờ flag để bộ xử lý EXI xác định có hay không các tùy chọn bổ sung được sử dụng. Trạng thái 1 là tùy chọn bổ sung được sử dụng và 0 là tùy chọn mặc định được sử dụng.

3.5.2.4. Phiên bản định dạng EXI

Phiên bản định dạng EXI EXI Format Version dùng để xác định phiên bản của định dạng EXI đang được sử dụng. Số phiên bản định dạng EXI là các số nguyên. Mỗi phiên bản tài liệu đặc tả định dạng EXI phải ghi rõ số phiên bản định dạng tương ứng. Bit đầu tiên của trường version chỉ ra đây là phiên bản preview hay final của định dạng EXI. Trong đó, 0 là phiên bản final c n 1 là phiên bản preview. Theo sau bit đầu tiên của version là một chuỗi bao gồm một hay nhiều 4 bit số nguyên không dấu biểu diễn số phiên bản version number .

Số phiên bản được xác định bằng cách tổng hợp các chuỗi số nguyên không dấu 4 bit, từ trái qua phải và cộng thêm 1. Chuỗi này sẽ bị chấm dứt bởi bất kỳ số nguyên không dấu có giá trị trong phạm vi 0 đến 14. Như vậy, 15 số phiên bản đầu tiên được biểu diễn bởi 4 bit, 15 số phiên bản tiếp theo được biểu diễn bởi 8 bit…

Số phiên bản định dạng EXI được tính theo các bước sau với số phiên bản ban đầu được khởi tạo bằng 1:

1. Đọc giá trị của 4 bit số nguyên không dấu tiếp theo. 2. Cộng giá trị vừa được đọc trong bước 1 vào số phiên bản.

3. Nếu giá trị là 15 thì thực hiện tiếp bước 1. Nếu không thì sử dụng giá trị hiện tại của số phiên bản là số phiên bản dịnh dạng EXI.

ảng 3.4: Một số phiên bản định dạng EXI EXI Format Version Mô tả

1 0000 Phiên bản xem trước 1

0 0000 Phiên bản cuối cùng 1 0 0001 Phiên bản cuối cùng 2 0 0010 - 0 1101 Phiên bản cuối cùng 3 - 14

Một phần của tài liệu luận văn: tìm hiểu và so sánh một số kỹ thuật nén XML (Trang 48)

Tải bản đầy đủ (PDF)

(83 trang)