Ngày nay, chỉ với một chiếc máy tính có nối mạng Internet, chúng ta đã có thể truy cập thông tin của bất kỳ tờ báo nào có thiết lập trang báo điện tử.. Ngoài ưu thế có thể chuy
Trang 1Chương 1 TỔNG QUAN 4
4
1.3 Sự vượt trội của báo điện tử so với báo giấy thông thường 5
1.4 Sự thành công của các tờ báo điện tử hiện nay 7
1.5 Sự gia tăng về số lượng độc giả của các báo điện tử 9
2.1 Tính khả thi của việc lấy tin tự động 34
Trang 22.1.4 Kết luận 36
2.2 Công cụ hỗ trợ việc thu thập tin tức từ các báo điện tử khác
36
43
45
3.2.3.3 Gói quản lý chuyên mục tin 52
3.2.4 Thuyết minh cho mô hình thực thể kết hợp 64
Trang 33.3.4.2 Thiết kế chức năng 68
78
4.1.2 Xây dựng công cụ hỗ trợ việc thu thập tin tự động 78
81
Trang 4LỜI CẢM ƠN
Tôi xin chân thành cảm ơn các thầy cô giáo giảng dạy tại khoa Toán Tin,
trường Đại học Hải Phòng, đã tạo điều kiện cho chúng tôi thực hiện đề tài
tốt nghiệp này
Xin cảm ơn Thầy Nguyễn Ngọc Khương người đã tận tình hướng dẫn, chỉ
bảo tôi trong suốt thời gian thực hiện đề tài Trong thời gian làm việc với
Thầy, tôi không những học hỏi được nhiều kiến thức bổ ích mà còn học
được tinh thần làm việc, thái độ nghiên cứu khoa học nghiêm túc của
Thầy
Xin gửi lời cảm ơn chân thành đến gia đình, ba mẹ và bè bạn vì đã luôn là
nguồn động viên to lớn, giúp đỡ tôi vượt qua những khó khăn trong suốt
quá trình làm việc
Mặc dù đã cố gắng hoàn thiện luận văn với tất cả sự nỗ lực của bản thân,
nhưng chắc chắn không thể tránh khỏi những thiếu sót Kính mong quý
Thầy Cô tận tình chỉ bảo
Một lần nữa, tôi xin chân thành cảm ơn và luôn mong nhận được sự đóng
góp quý báu của tất cả mọi người
Hải Phòng, Tháng 5/2012
Phan Thị Thanh Nhàn
Trang 5
MỞ ĐẦU
1.1 Lý do thực tiễn
Với sự gia tăng nhanh chóng của dân số và sự phát triển không ngừng của
công nghệ thông tin , kinh tế làm cho đời sống vật chất và tinh thần của
nhân dân ngày càng được nâng cao Nắm bắt thông tin về các vấn đề của
xã hội, văn hoá, thể thao, pháp luật, giải trí… đã trở thành một nhu cầu
không thể thiếu của độc giả Bên cạnh đó, báo giấy, báo nói, báo hình
ngày càng thể hiện nhiều bất cập của mình trong việc đưa thông tin đến
độc giả Do đó cần xây dựng một toà soạn báo điện tử để có thể đáp ứng
nhu cầu ngày càng cao về lượng thông tin hàng ngày của độc giả Giúp họ
cập nhật thông tin một cách nhanh chóng , chính xác và tiện lợi nhất
1.2 Lý do lý luận
Để xây dựng một tờ soạn báo có một lượng thông tin lớn được cập nhật
hàng ngày, hàng giờ nhanh chóng và chính xác đòi hỏi phải có một đội
ngũ nhân viên đông đảo và có kinh nghiệm làm việc Bên cạnh đó chi phí
cho toà soạn báo cũng không phải là thấp Ở Việt Nam không phải chi có
một toà soạn báo mà có ít nhất là 10 toà soạn báo Việc cập nhật thông tin
bị trùng lặp là không thể xảy ra dẫn đến sự lẵng phí về nguồn nhân lực và
chi phí Vậy tại sao chúng ta không xây dựng toà soạn báo điện tử cập
nhập thông tin từ những website tin tức khác để giảm sự lẵng phí trên
1.3 Mục đích nghiên cứu
Tìm hiểu một phần quy trình và xây dựng một toà soạn báo điện tử đồng
thời trang bị cho bản thân thêm những kiến thức cần thiết về lập trình,
những công cụ thiết kế web
Trang 6Chương 2 TỔNG QUAN
1.1 Cách nhìn nhận về báo điện tử :
Sự phát triển không ngừng của công nghệ thông tin là tiền đề cho sự phát
triển của các ngành khoa học khác.
Song song với sự phát triển mạnh mẽ của khoa học kỹ thuật, nhu cầu cập
nhật thông tin của con người ngày càng nâng cao Có thông tin thì con
người mới có thể tiếp cận, nắm bắt và hiểu biết được sự thay đổi của thế
giới xung quanh Một thông tin để được xem là đạt yêu cầu khi thông tin
đó cần thỏa mãn 5 điều kiện: nhanh, chính xác, đầy đủ, được cập nhật kịp
thời và cách trình bày phải thu hút Chính vì để thỏa mãn 5 yêu cầu trên
người ta mới nghĩ đến vai trò của việc phát hành một tờ báo điện tử
Vậy “Báo điện tử là gì ?” Đó là một hệ thống website được thiết kế và
thực thi trên nền Internet Trong đó, việc xử lý thông tin được thực hiện
tại máy chủ và trả về cho độc giả kết quả xử lý thông qua trình duyệt Web
như Internet Explorer, FireFox, Việc này rất tiện lợi vì độc giả có thể
truy cập được tin tức ở bất kỳ đâu không phụ thuộc vào môi trường làm
việc miễn là máy tính của họ có kết nối Internet và có cài đặt một trình
duyệt web
Báo điện tử không chỉ tập trung vào việc trao đổi thông tin, dịch vụ nhằm
phát sinh lợi nhuận mà còn hỗ trợ cho các nhu cầu khác của độc giả Hay
nói cách khác, “Báo điện tử” là một hình thức kinh doanh trong đó người
bán và người mua không cần trao đổi trực tiếp mà vẫn hiểu nhau và ngày
càng xích lại gần nhau hơn Dữ liệu để trao đổi thông tin có thể ở dạng văn
bản, biểu mẫu, đồ họa, các video clip, âm thanh hay hình ảnh động …Bạn
cũng có thể bắt gặp các trang báo điện tử hiện nay trên mạng mà mọi
người thường xuyên truy cập nhất Đó là: http://vnexpress.net ,
http://www.dantri.com ,…
Được xem là sự hội tụ của cả 3 loại hình báo chí đi trước là báo nói,
báo in và báo hình, báo điện tử đã thu hút được một lượng độc giả nhanh
chóng đáng kể ngay từ khi mới ra đời Nó chia sẻ số lượng độc giả của các
loại hình báo chí khác .Cùng với sự phát triển của Internet và máy tính,
loại hình báo chí này còn đang được dự đoán sẽ trở thành loại báo được
nhiều người đọc nhất chỉ trong vòng 5 năm tới
Trang 71.2 Sự vượt trội của báo điện tử so với báo giấy thông thường
Trước kia, nếu muốn có một tờ báo thì người ta phải ra tiệm hoặc sạp báo
để mua Ngày nay, chỉ với một chiếc máy tính có nối mạng Internet, chúng
ta đã có thể truy cập thông tin của bất kỳ tờ báo nào có thiết lập trang báo
điện tử
Với trang báo điện tử, ngay tại nhà, bạn sẽ biết được thông tin mua, bán,
giá cả thị trường, tư vấn sức khỏe, thông tin việc làm…
Không những vậy, báo điện tử còn đáp ứng được nhiều thắc mắc, góp ý
của những khách hàng khó tính Nó phục vụ nhiều loại hình dịch vụ đa
dạng cho nhiều loại khách hàng khác nhau
Với báo điện tử, cơ hội mở rộng giao dịch trao đổi mua bán là rất lớn
Không chỉ giữa doanh nghiệp và khách hàng thông qua loại hình dịch vụ
quảng cáo mà còn giữa các khách hàng với nhau
Chỉ sau vài năm xuất hiện, các báo điện tử đã khẳng định được thế mạnh
không thể phủ nhận của mình Với sự trợ giúp của công nghệ thông tin,
báo điện tử đã cho phép chuyển tải những thông tin tới người đọc gần
như tức thời bằng cả chữ viết, tiếng nói và cả hình ảnh Đây là lợi ích hơn
hẳn so với các loại hình báo khác, nhất là loại hình báo giấy khi phải chờ
đợi in ấn theo định kỳ xuất bản
Ngoài ưu thế có thể chuyển tải thông tin một cách nhanh nhất tới bất kỳ
nơi nào trên thế giới, một trong những lợi thế hơn hẳn của báo điện tử là
không phải mất chi phí và thời gian cho công việc in ấn, vấn đề nan giải
thường gặp phải đối với các tờ báo giấy
Trong khi một tờ báo giấy phải tính toán hàng loạt những vấn đề liên quan
tới chi phí như : số lượng trang in màu, đen trắng, số lượng báo cần in
thì đối với báo điện tử, điều này lại gần như vô nghĩa Đặc tính thiết kế
nhiều tầng lớp của báo điện tử giúp người làm báo có thể xuất bản theo
nhu cầu mà không bị giới hạn về số lượng chữ viết, hình ảnh và số
lượng trang báo.
Thêm vào đó, những tờ báo điện tử còn có lợi thế hơn hẳn trong việc giao
tiếp hai chiều với bạn đọc Những cuộc phỏng vấn trực tuyến được các
báo điện tử thực hiện liên tục trong thời gian gần đây đã chứng minh điều
đó Người đọc có thể tham gia gửi câu hỏi ngay trong lúc xem thông tin
qua mạng Khả năng này đã tạo cảm giác gần gũi hơn giữa bạn đọc và báo
Báo điện tử cũng dễ dàng thực hiện các cuộc thăm dò dư luận ngay trên
mặt báo của mình Điều mà các tờ báo khác không thể làm được Người
đọc có thể điền thông tin ngay trên mặt báo và hồi âm lại chỉ bằng một
động tác click chuột
Trang 8Những thế mạnh trên đã giải thích vì sao báo điện tử trên thế giới và Việt
Nam lại có tốc độ phát triển nhanh đến chóng mặt Chỉ sau vài năm ra đời,
Việt Nam đã hình thành cả một mạng lưới lên tới hàng chục tờ báo điện
tử Các tờ báo này cũng đều có mức gia tăng người đọc (được tính bằng số
lần truy cập) liên tục hàng ngày và thậm chí là hàng giờ
Hiện tại, thị trường báo điện tử đã có sự góp mặt của hầu hết các tờ báo in
có tên tuổi như Nhân dân, Lao động, Thanh niên Song song với việc xuất
bản báo giấy, các tòa soạn đều đã thành lập những bộ phận riêng biệt
chuyên làm báo điện tử Sự phát triển mạnh mẽ trên đã góp phần tạo nên
một thị trường báo chí đa dạng, mới mẻ, hiện đại hơn và đặc biệt thích hợp
với giới trẻ - những người luôn thích ứng nhanh với công nghệ mới
Theo dự đoán của giới chuyên môn, với một lực lượng phóng viên chuyên
nghiệp sẵn có kinh nghiệm nhiều năm, những tờ báo giấy lớn hiện nay có
nhiều triển vọng để trở thành những tờ báo điện tử có số lượng người truy
cập lớn nhất trong tương lai
1.3 Sự thành công của các tờ báo điện
tử hiện nay
1.3.1 Trong nước
Bước ngoặt của báo điện tử ở Việt Nam đă
được đánh dấu bằng sự ra đời của các báo
điện tử như Laodong, Vneconomy (Thời
báo Kinh tế Việt Nam), VnExpress,
Vietnamnet
Báo chí điện tử mới phát triển ở nước ta trong 5 năm qua nhưng đã
đạt được những kết quả đáng khích lệ Năm 1997, báo chí điện tử Việt
Nam mới chỉ có một tạp chí điện tử (tạp chí Quê hương), nhưng đến nay
đã nâng tổng số lên 21 tờ báo điện tử, hai nhà xuất bản và một số báo đã
có trang điện tử (tính đến tháng 8/2002) Nhiều tờ báo sau khi đưa lên
mạng đã thu hút ngay một số lượng độc giả rất nhiều so với báo in như:
Lao động, Nhân dân, Sài Gòn giải phóng
Với ưu thế mà báo in không có được, báo điện tử đã cập nhật một cách
nhanh nhất các sự kiện, sự việc diễn ra trong đời sống chính trị, kinh tế, xã
hội Số lượng người đọc ngày càng đông vì báo điện tử có thể đáp ứng
mọi yêu cầu và cung cấp đầy đủ các thông tin mà mọi người quan tâm
So với báo in, phát thanh, truyền hình, báo chí điện tử còn có khả năng lưu
trữ, bảo quản thông tin hiệu quả, gọn nhẹ, đỡ tốn kém và phục vụ kịp thời
cho việc tra cứu của độc giả theo yêu cầu Bên cạnh đó, báo điện tử đã
khắc phục được cơ bản những trở ngại đối với báo in khi đưa ra nước
ngoài Mặt khác, báo chí điện tử còn là phương tiện để tuyên truyền chủ
Trang web Laodong.com.vn.
Trang 9trương, đường lối, chính sách của Đảng và Nhà nước, giúp cho bạn bè trên
thế giới, Việt kiều đang sống ở nước ngoài hiểu về công cuộc đổi mới, tình
hình phát triển của đất nước
1.3.2 Ngoài nước
Trên thế giới, báo điện tử đã sớm trở thành một xu hướng và đang
phát triển rất mạnh Trường hợp của ông Michael Maier là một ví dụ.
Với việc thành lập báo điện tử Netzeitung, ông Maier giờ đây đã thực hiện
được ước mơ của mình Nổi tiếng ngay từ khi còn làm chủ bút tờ Berliner
Zeitung ở Berlin, song ông trùm báo chí Đức 42 tuổi Michael Maier vẫn
nuôi ý tưởng làm báo điện tử Và khi chuyển sang làm tạp chí Stern, ông
được coi là người đi đầu một kỷ nguyên báo chí mới ở Đức Tuy nhiên,
sau 6 tháng chuẩn bị, vào tháng 7-1999, ông lại rời Stern sang Jerusalem
trước khi "kỷ nguyên báo chí mới" của ông bắt đầu
Trải qua một sự thay đổi có ảnh hưởng sâu rộng ở Jerusalem, Maier đã
nhận ra rằng, ông không nhất thiết phải in báo thêm nữa Ông có thể tìm
thấy bất cứ điều gì ông muốn trên Internet Maier đã tự đặt mình trong một
phòng thưa thớt đồ đạc: một bàn làm việc, một máy vi tính và một tivi
Trên bàn có thêm vài tờ báo thay vì cả đống chất ngất như khi còn ở
Berliner Zeitung Maier còn nghĩ xa hơn nữa: 2 tờ báo vẫn còn là quá
nhiều đối với ông
Maier đã bắt tay vào làm tờ báo điện tử Netzeitung từ đầu tháng 10 năm
2000 Tờ báo mạng với đội ngũ nhân viên 30 người đang trong giai đoạn
hoạt động thử nghiệm Họ hy vọng với sự tiên phong của nó, báo điện tử
sẽ cách mạng hoá ngành báo chí ở Đức Mặc dù, tờ báo này được thành
lập mà không có một nguồn thu nhập nào khác, không có các băng quảng
cáo, thậm chí là không có cả một chiến dịch quảng cáo ngoài Internet,
nhưng ông Maier vẫn tin rằng, Netzeitung sẽ trở thành một trong những
nguồn tin tức hàng đầu ở Đức trên Internet
Maier lý giải: “Nếu tôi cầm một tờ báo và nhận ra rằng tôi đã xem mọi
tin tức trong tờ báo này trên bản tin truyền hình hôm qua, thì nó trở
nên vô dụng đối với tôi” Và nếu bản tin truyền hình đã bắt đầu quyến rũ
được những người đọc báo, thì rồi những bản tin Internet với việc đề cập
tất cả những sự kiện mới nhất từ 6 giờ sáng đến 11 giờ đêm, cập nhật từng
10 phút một, sẽ làm cho tờ báo điện tử càng
hoàn thiện hơn
Tính xu hướng của Báo điện tử còn thể
hiện rõ trên Báo cáo Tình trạng thông tin
Hoa Kỳ 2004 (do Trung tâm nghiên cứu
Pew và Dự án cho tính ưu việt báo chí
Trang 10thực hiện, công bố ngày 24-5-2004), hiện có đến 66% người Mỹ xem tin
tức trên mạng (chia thành ba nhóm: khoảng 50% xem tin nóng; 30% xem
tin cùng lúc với công việc trực tuyến khác, chẳng hạn kiểm tra email, chat
hoặc mua sắm trên mạng; và còn lại là thành phần cố ý tìm thêm thông tin
về vấn đề gì đó mà họ đã nghe qua)
1.4 Sự gia tăng về số lượng độc giả của các báo điện tử
Toàn cảnh CNTT Việt Nam 2004 cho biết, đã có 5 trang web tiếng Việt
lọt vào top 10.000 website toàn cầu Tính theo cả số lượt truy cập cũng
như lưu lượng truy cập, thì VnExpress giữ vị trí đứng đầu, Tin tức Việt
Nam đứng thứ 2, Việt Nam Net đứng thứ 3 Ngoài ra, báo điện tử Thanh
Niên xếp ở vị trí thứ 4 và Tuổi Trẻ đứng hàng thứ 5.
Hiện nay, VnExpress có hơn 800.000 độc giả thường xuyên, với trung
bình 13 triệu lượt người truy cập hàng tháng VnExpress được các nhà báo
viết về CNTT bình chọn là một trong 10 sự kiện nổi bật trong lĩnh vực
công nghệ thông tin của năm 2002 vì
"đã thực sự là một biểu tượng cho sự
phát triển nội dung Internet ở Việt
Nam"
Theo Hiệp hội Báo chí thế giới (dẫn lại
từ BBC ngày 1-6-2004), lượng độc giả
báo điện tử (toàn cầu) đã tăng 350%
trong 5 năm qua
Về lý thuyết, khái niệm truyền thông đại chúng đã thể hiện cực rõ trong
hoạt động báo điện tử Nếu như báo in chỉ phát hành được khoảng vài
trăm ngàn hay trên 1 triệu bản, báo điện tử có thể đến với hàng triệu độc
giả không chỉ trong nước mà còn khắp thế giới, tại bất cứ nơi nào có máy
tính truy cập mạng
Trang 111.5 Mục tiêu đề tài
Qua những phân tích về mặt công nghệ và xu hướng phát triển của Báo
điện tử trong tương lai, nhóm đề ra những mục tiêu sau cho đề tài :
1.5.1 Tìm hiểu Regular Expression
Đôi khi bạn cần kiểm tra dữ liệu nhập vào có đúng với cấu trúc và nội
dung được quy định trước hay không Ví dụ, bạn muốn bảo đảm người
dùng nhập địa chỉ IP, số điện thoại, hay địa chỉ e-mail hợp lệ Khi đó, bạn
sẽ cần tới Regular Expression (RegEx), hay còn gọi là 'Biểu thức chính
quy"
1.5.1.1 Giới thiệu
Biểu thức chính quy (regular expression, viết tắt là regexp, regex hay
regxp) là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú
pháp nhất định Biểu thức chính quy thường được dùng trong các trình
biên tập văn bản và các tiện ích tìm kiếm và xử lý văn bản dựa trên các
mẫu được quy định Nhiều ngôn ngữ lập trình cũng hỗ trợ biểu thức chính
quy trong việc xử lý chuỗi, chẳng hạn như C#, Perl có bộ máy mạnh mẽ
để xử lý biểu thức chính quy được xây dựng trực tiếp trong cú pháp của
chúng Bộ các trình tiện ích (gồm trình biên tập sed và trình lọc grep) đi
kèm các bản phân phối Unix có vai trò đầu tiên trong việc phổ biến khái
niệm biểu thức chính quy
Thuật ngữ regular expression xuất phát từ lý thuyết toán học và khoa học
máy tính, nó phản ánh một đặc điểm của các biểu thức toán học được gọi
là chính quy (regularity) Một biểu thức có thể được thực hiện trong một
phần mềm bằng cách sử dụng một bộ xác định giới hạn tự động
(Deterministic Finite Automation – DFA) DFA là một trạng thái xác định
và không sử dụng cơ chế quay lui (backtracking)
Nếu bạn sử dụng tốt những kỹ năng về regular expression Chúng sẽ đơn
giản hơn nhiều trong lập trình và quá trình xử lý văn bản, và có những vấn
đề sẽ không thể giải quyết được nếu không sử dụng regular expression
Trang 12Bạn sẽ cần đến hàng trăm thủ tục để trích xuất tất cả các địa chỉ email từ
một số tài liệu, đây có thể nói là một việc làm tẻ nhạc và vất vã Nhưng
với regular expression bạn chỉ cần một số dòng lệnh hoặc thậm chí một
dòng lệnh để làm việc này
Regular expression là một ngôn ngữ cực mạnh dùng mô tả văn bản
cũng như thao tác trên văn bản Đó là một biểu thức ở dạng chuỗi mô tả
một quy tắc dùng để so khớp mẫu văn bản Bất kỳ chuỗi đầu vào nào thỏa
quy tắc này sẽ được coi là một chuỗi hợp lệ Việc sử dụng Regex sẽ giúp
ta loại bỏ được các dữ liệu không hợp lệ trong quá trình nhập liệu Do đó
nắm vững các biểu thức chính quy sẽ giúp bạn tiết kiệm nhiều thời gian và
công sức
Một Regular expression thường được ứng dụng lên một chuỗi, nghĩa là
lên một nhóm ký tự
Chẳng hạn, ta có chuỗi sau:
Mot, Hai, Ba, Bon, NEVERLAND.
Bạn có thể trả về bất cứ hoặc tất cả các chuỗi con của nó (Hai hoặc
Bon chẳng hạn) hoặc thay đổi phiên bản của những chuỗi con của nó (Mot
hoặc BoN chẳng hạn)
1.5.1.2 Xây dựng 1 Regilar Expression
Trước tiên, bạn phải xác định cú pháp của biểu thức chính quy cho phù
hợp với cấu trúc và nội dung của dữ liệu cần kiểm tra, đây là phần khó
nhất khi sử dụng biểu thức chính quy Một Regular expression là một kiểu
mẫu văn bản gồm 2 phần:
literal (trực kiện): Đơn thuần là một ký tự(a-z) mà chúng ta muốn đem
so khớp với chuỗi đích
metacharacters (siêu ký tự): Là một ký tự đặc biệt hoạt động như là
một mệnh lệnh đối với một phần phân tích ngữ nghĩa(parser) của Regular
Expression Siêu ký tự hỗ trợ việc so trùng các ký tự đại diện (wildcard),
tầm trị, nhóm, lặp, điều kiện, và các cơ chế điều khiển khác
Ví dụ một regular expression như sau:
^ (From|To|Subject|Date) :
Regular expression này sẽ khớp với bất cứ chuỗi con nào miễn là chuỗi
này là một hàng mới bắt đầu với “From” hoặc “To” hoặc các chữ
“Subject” hoặc “Date” (Dấu ^ nghĩa là bắt đầu 1 hàng mới) chuỗi này kết
Dấu ^ cho bộ parser của RE biết chuỗi mà ban đang truy tìm phải bắt
đầu bởi một hàng mới Các chữ “From”, “To”, là những literal, và những
metacharacter “(“, “)”, và “|” được dùng để tạo nhóm literal và cho biết bất
Trang 13cứ những lựa chọn nào cũng phải khớp Dấu ^ cũng là metacharacter, nó
cho biết là khởi đầu 1 hàng Do đó, chúng ta đọc hàng sau đây:
^ (From|To|Subject|Date) :
Như sau: “cho khớp bất cứ chuỗi con nào bắt đầu bởi một hàng mới theo
sau bởi bất cứ 4 chuỗi literal: From,To,Subject và Date rồi theo sau bởi
dấu hai chấm”
1.5.1.2 Các ký tự siêu thường dùng
. Đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n
\d Ký tự chữ số thập phân (digit)
\D Ký tự không phải chữ số (non-digit)
\s Ký tự whitespace (như khoảng trắng, tab )
\S Ký tự non-whitespace
\w Ký tự word (gồm mẫu tự, chữ số, và dấu gạch dưới)
\W Ký tự non-word
^ Bắt đầu một chuỗi hoặc dòng
\A Bắt đầu một chuỗi
$ Kết thúc một chuỗi hoặc dòng
\z Kết thúc một chuỗi
| Ngăn cách các biểu thức có thể so trùng, ví dụ AAA|ABA|
ABB sẽ so trùng với AAA, ABA, hoặc ABB (các biểu thức được so trùng từ trái sang)
[abc] So trùng với một trong các ký tự trong nhóm, ví dụ [AbC] sẽ
so trùng với A, b, hoặc C
[^abc] So trùng với bất cứ ký tự nào không thuộc các ký tự trong
nhóm, ví dụ [^AbC] sẽ không so trùng với A, b, or C nhưng
so trùng với B, F,…
[a-z] So trùng với bất kỳ ký tự nào thuộc khoảng này, ví dụ [A-C]
sẽ so trùng với A, B, hoặc C
() Xác định một biểu thức con sao cho nó được xem như một
yếu tố đơn lẻ đối với các yếu tố được trình bày trong bảng này
? Xác định có một hoặc không có ký tự hoặc biểu thức con
đứng trước nó, ví dụ A?B so trùng với B, AB, nhưng không
Trang 14so trùng với AAB
* Xác định không có hoặc có nhiều ký tự hoặc biểu thức con
đứng trước nó, ví dụ A*B so trùng với B, AB, AAB, AAAB,
…
+ Xác định có một hoặc có nhiều ký tự hoặc biểu thức con
đứng trước nó, ví dụ A+B so trùng với AB, AAB, AAAB,…
nhưng không so trùng với B
{n} Xác định có đúng n ký tự hoặc biểu thức con đứng trước nó,
ví dụ A{2} chỉ so trùng với AA
{n,} Xác định có ít nhất n ký tự hoặc biểu thức con đứng trước
nó, ví dụ A{2,} so trùng với AA, AAA, AAAA,… nhưng không so trùng với A
{n,m} Xác định có từ n đến m ký tự đứng trước nó, ví dụ A{2,4}
so trùng với AA, AAA, và AAAA nhưng không so trùng với
A hoặc AAAAA
1.5.1.3 Các lớp để thao tác với Regular Expression
NET cung cấp một cách tiếp cận hướng đối tượng về việc so khớp chuỗi
và thay thế theo Regular Expression System.Text.Regular Expression là
namespace trên thư viện các lớp chuẩn của NET liên quan đến tất cả các
đối tượng gắn liền với Regular Expression
Regex
Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch
(read-only) Nó cũng chứa một phương thức tĩnh (static) cho phép chúng
ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác
Ví dụ:
string pattern= “<H2 class=Lead>” ;
Regex myRegex= new Regex(pattern);
Thành phần của lớp Regex:
Thuộc tính
Options: trả về những mục chọn được trao qua cho constructor Regex.
RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải
qua trái hay không
Phương thức
GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với
Regular Expression
Trang 15GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng
với tên nhóm trên 1 mảng
GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được
khai báo
IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay
không trên pattern
Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về
kết quả chính xác như là một đối tượng Match duy nhất
Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay
không rồi trả về tất cả những so khớp thành công xem như Match được gọi
nhiều lần
Replace: cho thay thế những xuất hiện của một pattern được định nghĩa
bởi một RE bởi một chuỗi ký tự thay thế được chỉ định
Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị
trí được chỉ định bởi một so khớp trên RE
Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern.
Lớp Match
Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so
khớp (match) Regular Expression Sau đây mình có 1 ví dụ nhỏ sử dụng
phương thức Match của lớp Regex để trả về 1 đối tượng kiểu Match để có
thể tìm ra so khớp đầu tiên trên chuỗi nhập
Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu
xem đã tìm ra 1 so khớp hay chưa
Ví dụ:
string chuoi = "123abcd456bdabc";
string pattern = "abc";
Regex myRegex = new Regex(pattern);
Match m = myRegex.Match(chuoi);
if (m.Success)
{
Console.WriteLine("Tim thay chuoi con {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);
}
Else
{
Trang 16Console.WriteLine("Khong tim thay chi ca");
}
Kết quả:
Tim thay chuoi con abc o vi tri thu 3 trong chuoi
Lớp MatchCollection
Lớp này tượng trưng cho 1 loạt những so khớp thành công đè chồng lên
nhau tạo thành một tập hợp bất di bất dịch và lớp này không có phương
thức khởi tạo Những đối tượng MatchCollection sẽ do thuộc
tính Regex.Matches của lớp Regex trả về.Hay MatchCollection là mảng
các đối tượng Match là được
string pattern = "like";
Regex myRegex = new Regex(pattern);
mc = myRegex.Matches(chuoi);
foreach (Match m in mc)
{
Console.WriteLine("Chuoi con '{0}' xuat
hien o chi muc {1}", m.Value, m.Index);
}
}
Kết quả trả về:
Chuoi con 'like' xuat hien o chi muc 2
Chuoi con 'like' xuat hien o chi muc 14
Chuoi con 'like' xuat hien o chi muc 29
Sử dụng Regex Match Collections:
Hai thuộc tính của đối tượng Match là:
Chiều dài
Vị trí của pattern trong chuỗi
Xét ví dụ:
Trang 17static void Main(string[] args)
Console.WriteLine("The match[{0}]: '{1}' co chieu
dai la {2}", i,mc[i].Value, mc[i].Length);
}
}
Chuỗi \S đi tìm những ký tự không phải khoảng trắng, và dấu + cho biết
một hoặc nhiều ký tự ở đằng sau Còn \s cho biết là khoảng trắng Do đó,
gộp lại ta có mệnh đề “hãy đi tìm bất cứ ký tự non-whitespace theo sau bởi
whitespace”
Kết quả của ví dụ trên là:
The match[0]: 'This ' co chieu dai la 5
The match[1]: 'is ' co chieu dai la 3
The match[2]: 'a ' co chieu dai la 2
The match[3]: 'example ' co chieu dai la 8
Lớp Group
Đôi khi người ta cho là rất tiện khi cho gộp lại những biểu thức con so
khớp với nhau như vậy bạn có thể phân tích ngữ nghĩa những đoạn của
chuỗi khớp
Ví dụ, có thể bạn muốn so khớp dựa trên địa chỉ IP và cho gộp lại tất cả
các IP tìm thấy được bất cứ nơi nào trên đoạn chuỗi
Lớp Group cho phép bạn tạo những nhóm so khớp dựa trên cú pháp
Regular Expression, và tượng trưng cho kết quả từ 1 biểu thức gộp nhóm
duy nhất
Một biểu thức gộp nhóm đặt tên cho một nhóm và cung cấp 1 Regular
Expression; bất cứ chuỗi con nào khớp với Regular Expression sẽ được
đưa vào nhóm Ví dụ, muốn tạo 1 nhóm IP, bạn có thể viết một Regular
Expression cho biết một hoặc nhiều digit hay dot theo sau bởi space như
sau:
@”(?(\d|\.)+)\s”
Trang 18Lớp Match được dẫn xuất từ Group, và có một tập hợp mang tên
Groups chứa tất cả các nhóm mà Match tìm thấy
Lớp Group tượng trưng cho những kết quả thu hoạch được từ 1 thu
lượm nhóm duy nhất Ví Group có thể thu lượm 0, 1 hoặc nhiều chuỗi chữ
trong một lần so khớp duy nhất, nó chứa một tập hợp gồm những đối
tượng của Capture Vì Group kế thừa từ Capture, substring bị thu lượm có
thể được truy xuất trực tiếp
Các thể hiện của Group sẽ được trả về bởi thuộc tính
Match.Groups(số group) hoặc Match.Groups(“tên group”) nếu cấu trúc
gộp nhóm
“(?<groupname>)” được dùng đến.
Ví dụ sau đây sử dụng kiến trúc gộp nhóm lồng nhau để thu lượm
những chuỗi con gộp thành nhóm:
static void Main(string[] args)
{
string pattern = "(a(b))c";
string chuoi = "abbabc";
Regex myRegex = new Regex(pattern);
Đoạn mã sau đây sử dụng kiến trúc gộp nhóm có mang tên (name và
value) để thu lượm những substrings từ một chuỗi chứa dữ liệu trên 1 dạng
thức “DATANAME:VALUE” mà RE bị chẻ ở dâu dấu hai chấm (:)
static void Main(string[] args)
Trang 19Kết quả:
Section:119900 co chieu dai 14
Section co chieu dai 7
119900 co chieu dai 6
Lớp GroupCollection
Là lớp tượng trưng cho 1 tập hợp gồm toàn những nhóm được thu
lượm và trả về một lô những nhóm được thu lượm trong một lần so khớp
duy nhất Collection này thuộc loại read-only và không có phương thức
khởi tạo Các thể hiện của lớp GroupCollection được trả về trong tập hợp
mà thuộc tính Match.Groups trả về
Ví dụ: Dò tìm và in ra số những nhóm được thu lượm bởi một
Regular Expression Làm thế nào để trích từng thu lượm riêng rẽ trên mỗi
thành viên của môt group collection
static void Main(string[] args)
Mỗi lần một đối tượng Regex khớp với một subexpression, một thể
hiện Capture sẽ được tạo ra, và được thêm vào tập hợp CaptureCollection
Mỗi đối tượng Capture tượng trưng cho một thu lượm (capture) đơn lẻ
Mỗi nhóm sẽ có riêng cho mình một capture collection những mục khớp
với subexpression được gắn liền với nhóm
Lớp CaptureCollection tượng trưng cho một loạt những chuỗi con
được thu lượm và trả về một lô những thu lượm được thực hiện chỉ qua
một nhóm thu lượm duy nhất Thuộc tính Captures, một đối tượng của lớp
CaptureCollection, được cung cấp như là một thành viên của các lớp
Match và Group giúp truy xuất dễ dàng lô các chuỗi con được thu lượm
Ví dụ sau đây tôi dùng đến regular expression (Abc)+ để tìm ra một
hoặc nhiều so khớp trên chuỗi “XYZAbcAbcAbcXYZAbcAb”
static void Main(string[] args)
Trang 20{
string chuoi =
"XYZAbcAbcAbcXYZAbcAb";
string pattern = "(Abc)+";
Regex myRegex = new
Regex(pattern);
Match m = myRegex.Match(chuoi);
GroupCollection gc = m.Groups;
CaptureCollection cc;
Console.WriteLine("So nhom thu
luom duoc = {0}",gc.Count.ToString());
Abc bat dau tu ky tu 3
Abc bat dau tu ky tu 6
Abc bat dau tu ky tu 9
1.5.1.5 Khai báo sử dụng regular expression trong các ngôn ngữ lập
trình
Regular expression là một phần của ngôn ngữ lập trình và các thư viện để
hoạt động và phát triển Sau đây là khai báo sử dụng regular expression
trong 2 ngôn ngữ lớn là Java và C#:
Với ngôn ngữ Java:
using java.util.regex;
Với ngôn ngữ C#:
Trang 21using System.Text.RegularExpressions;
Với những thư viện đã khai báo sử dụng Chúng ta có thể thực hiện những
công việc thông thường của regular expression như tìm kiếm và thay thế
bằng cách xây dựng những cú pháp đặc biệt
1.5.1.4 Những công cụ làm việc với biểu thức chính quy
Các công cụ được giới thiệu trong phần này sẽ giúp chúng ta xây dựng,
kiểm tra lỗi, kiểm tra cú pháp và những thông tin phản hồi hỗ trợ chúng ta
lập trình tốt hơn Bạn nên kiểm tra biểu thức chính quy của mình xây dựng
trong những công cụ này để kiểm tra độ chính xác của biểu thức đó
RegexBuddy
Regexbuddy là một công cụ đầy đủ các tính năng nhất hiện nay để tạo lập,
kiểm tra và thực thi các biểu thức chính quy Nó có bộ biểu thức chính quy
Trang 22cho những ngôn ngữ lập trình khác nhau như: NET, Java,… Và cho phép
chuyển đổi biểu thức chính quy giữa các ngôn ngữ lập trình
RegexBuddy được thiết kế bởi Jan Goyvaerts (là một chuyên gia về
Regular Expression)
RegexBuddy sẽ tự động tô sáng những phần phù hợp với biểu thức chính
quy của bạn, và thông báo những lỗi xuất hiện trong biểu thức chính quy
(nếu có) Sau đây là một vài button thường hay sử dụng trong
RegexBuddy:
List All: hiển thị một danh sách tất cả các chuỗi phù hợp với biểu thức
chính quy
Replace: nằm ở phía trên của màn hình Có chức năng tìm kiếm và thay
thế chuỗi được nhập vào trong textbox với biểu thức chính quy
Split: Sử lý các biểu thức chính quy bằng cách tách riêng thành các
token cơ sở ở những nơi mà đối tượng của bạn được tìm thấy bằng cách sử
dụng biểu thức chính quy của bạn
Click bất kỳ button nào và lựa chọn Update Automatically để
RegexBuddy hiển thị kết quả một cách tự động và đồng bộ khi bạn thay
đổi bất cứ gì trong biểu thức chính quy
Copy button: đưa biểu thức chính quy được tạo vào clipboard để bạn
dán vào source code của mình
RegexBuddy có thể chạy trên Windows 98, ME, 2000, XP, Vista and
Windows 7 Còn có thể chạy tốt trên các môi trường như: Mware,
Parallels, CrossOver Office
RegexPal
RegexPal là một trình kiểm tra biểu thức chính quy online được tạo bởi tác
giả Steven Levithan Bạn chỉ âần một trình duyệt web hiện đại và một
đường truyền internet là có thể sử dụng nó RegexPal được viết hoàn toàn
bằng JavaScript, do đó nó chỉ hỗ trợ ngôn ngữ JavasScript
Trang 23RegexPal sẽ tự động tô màu các chuỗi phù hợp với chuỗi biểu thức chính
quy được nhập ở ô phía trên Nếu bạn nhập một cú pháp sai thì RegexPal
sẽ tô sáng những phần sai đó RegexPal là công cụ tôi thường sử dụng khi
viết các chương trình trên Net để kiểm tra biểu thức chính quy của mình
Một vài công cụ kiểm tra biểu thức chính quy online khác
Để tạo một công cụ kiểm tra biểu thức chính quy online là một điều không
quá khó Nếu bạn có một kiến thức về phát triển web và những kiến thức
về regular expression cần thiết thì bạn có thể tự tạo cho mình một trang
như RegexPal kể trên Và có hàng trăm người đã làm sẵn nó cho bạn Sau
đây là một số trang điển hình:
http://regex.larsolavtorvik.com/: Hỗ trợ PHP PCRE, PHP POSIX và JavaScript.
Trang 24http://www.nregex.com/ : hỗ trợ các ngôn ngữ NET được phát triển bởi David
Seruyange
http://www.rubular.com/: được xây dựng bởi tác giả Micheal Lovitt.
Trang 25http://www.myregexp.com : là một Java applet chạy trên trình duyệt web (yêu
cầu cài đặt Java trình duyệt) Trang này sử dụng thư viện java.until.regex để hỗ
trợ Do đó những biểu thức chính quy được tạo ở trang này hoàn toàn phù hợp
với Java
1.7.2 Tìm hiểu Linq to XML
XML là một ngôn ngữ được ứng dụng rất nhiều trong lập trình, xử lý dữ
liệu cũng như truyền tải thông tin Trước đây việc thao tác và tạo ra các tài
liệu XML thông qua DOM XML API trong Net rất dài dòng và rắc rối Vì
Trang 26thế để khắc phục điều này, Microsoft đã cho ra đời LINQ cùng với LINQ
to XML API
1.7.2.1 Từ DOM XML API đến LINQ to XML API
Ví dụ để tạo một tài liệu XML đơn giản sau
Sử dụng cách cũ với DOM XML API (namespace System.Xml):
XmlDocument doc = new XmlDocument();
XmlElement blog = doc.CreateElement("Blog");
XmlElement title = doc.CreateElement("Title");
title.InnerText = "YinYang's Programming Blog";
XmlElement author = doc.CreateElement("Author");
XmlElement firstName = doc.CreateElement("FirstName");
firstName.InnerText = "Yin";
XmlElement lastName = doc.CreateElement("LastName");
lastName.InnerText = "Yang";
XmlElement categories = doc.CreateElement("Categories");
XmlElement category1 = doc.CreateElement("Category");
Trang 27Đoạn mã trên mặc dù rất dễ hiểu nhưng cú pháp lại quá dài dòng Việc tạo
ra một cấu trúc XML theo cách trên chỉ tập trung vào hai phương thức:
CreateElement() để tạo một phần tử mới và AppendChild() để thêm phần
tử con vào phần tử hiện tại Đây quả thực là một thứ dễ gây chán nản nếu
như bạn phải thường xuyên làm việc với chúng
Bây giờ ta thử xem cách mới theo LINQ to XML (namespace
new XElement("FirstName", "Yin"),
new XElement("LastName", "Yang")),
Rất đơn giản và dễ hiểu, chỉ cần duy nhất một lớp XElement để tạo ra một
tài liệu XML như trên Điểm chính của cách làm này là sử dụng từ khóa
params Cho phép truyền một số lượng tham số không xác định vào
phương thức Một overload của constructor lớp XElement được sử dụng
nhiều nhất là:
public XElement(XName name, params object[] content);
Theo overload này, một phần tử được tạo ra dựa hai yếu tố: tên của phần
tử và các phần tử con của nó
Trang 28Tất cả các phần tử thuộc mảng content trong tham số trên đều trở thành
phần tử con của đối tượng XElement được định nghĩa
Và như bạn thấy với cú pháp này, mã nguồn được rút gọn rất nhiều so với
cách cũ Tuy nhiên do các tham số được lồng nhau và phân cấp trên một
dòng lệnh nên một rắc rối mà ta gặp phải là khó xác định được cấu trúc
của tài liệu XML được tạo ra
Vì lý do trên, bạn nên hạn chế lồng quá nhiều phần tử và phân cấp quá
nhiều khi tạo một đối tượng XElement Chia ra khởi tạo nhiều XElement
sau đó hợp lại là cách tốt để làm đoạn mã dễ hiểu hơn Một lời khuyên đơn
giản nữa là khi viết code, bạn hãy giữ việc thụt lề theo cấp độ của phần tử
trong tài liệu XML như trong đoạn mã ví dụ trên, như vậy nội dung và cấu
trúc của tài liệu XML gần như hiện lên trước mắt bạn.
1.5.2 Cây phân cấp lớp của LINQ to XML API
Sau khi lược bỏ một vài lớp mà tôi sẽ chưa bàn tới, ta có cây phân cấp lớp của
LINQ to XML API, tất cả các lớp này đểu nằm trong namespace
System.Xml.Linq Tuy nhiên bạn cũng cần add reference đến namespace
System.Xml do các lớp thừa kế một vài interface từ namespace này như
IXmlLineInfo, IXmlSerializable:
Trang 29Công dụng của mỗi lớp trên có thể được nhận biết ngay từ tên gọi của chúng, tuy
nhiên để đảm bảo mọi thứ rõ ràng, tôi đã tạo một bảng liệt kê các lớp này cùng
với mô tả ngắn gọn của chúng
XName Đại diện cho một tên của một phần tử XML hay thuộc tính
XNamespace Đại diện một không gian tên XML Lớp này không thể
được di truyềnXObject Đại diện cho một nút hoặc một thuộc tính trong một cây
XMLXAttribute Đại diện một thuộc tính XML
XNode Đại diện các khái niệm trừu tượng của một nút (yếu tố,
bình luận, loại tài liệu, hướng xử lý, hoặc văn bản nút) trong cây XML
XText Đại diện một nút văn bản
XComment Đại diện một bình luận XML
XContainer Đại diện một nút có thể chứa các nút khác
XElement Đại diện một phần tử XML
XDocument Đại diện một tài liệu XML
Sau khi đã có cái nhìn tổng quan về mô hình lớp của API này, ta sẽ đi sâu
hơn vào xem xét một vài lớp chính mà ta sẽ không thể bỏ lỡ nếu như
muốn làm thành thạo được LINQ to XML
XNamespace
Đại diện cho một namespace trong tài liệu XML Bạn có thể tạo thể hiện
của lớp này từ một đối tượng string có dạng URI
XNamespace ns=”http://yinyangit.wordpress.com/namespace“
Để gán namespace cho một phần tử, thông thường ta sẽ tạo một đối tượng
XNamespace và dùng toán tử cộng để tạo ra một tên đầy đủ cho phần tử:
XNamespace ns=”http://yinyangit.wordpress.com/namespace”
XElement x= new XElement(ns+”FirstElement”);
XName
Mỗi phần tử XML được tạo ra đều phải có tên, và tên này được đại diện
bằng một đối tượng XName Về cơ bản, XName là một định danh bao
gồm tên cục bộ và tên namespace của phần tử (bao gồm XNamespace)
Trang 30Giống như XNamespace, XName có thể tự động được tạo ra từ một đối
tượng string bằng cách overload operator:
public static implicit operator XName(string expandedName);
Một đối tượng XName sẽ được tạo ra trong mỗi dòng lệnh sau:
XName name = “Test”;
XElement root = new XElement(“Test”);
Ngoài ra bạn có thể tạo một XName bao gồm tên cục bộ và namespace
bằng cách đặt tên namespace trong cặp {} và theo sau đó là tên cục bộ:
XName name=”{http://yinyangit.wordpress.com}Test”;
Khi đó property LocalName sẽ là “Test” và Namespace sẽ là
http://yinyangit.wordpress.com
XObject
Được thừa kế từ System.Object và IXmlLineInfo (System.Xml), XObject
là một lớp abstract nằm ở đỉnh của cây phân cấp mà tôi minh họa ở trên
Lớp này cung cấp các property cần thiết giúp ta truy xuất được những
phần tử liên quan và một số thông tin cần thiết của phần tử trong tài liệu
XML
- Document: đối tượng XDocument chứa toàn bộ cấu trúc và nội dung
của tài liệu XML
- NoteType: lưu giá trị kiểu enum XmlNodeType xác định kiểu của
phần tử
- Parent: tham chiếu đến phần tử cha có kiểu XElement.
Ngoài ra lớp này chứa hai event là Changed và Changing được kích hoạt
mỗi khi phần tử bị thay đổi Hai event này có kiểu EventHandler
<XObjectChangeEventArgs> Lớp XObjectChangeEventArgs chứa
property có kiểu XObjectChange, đây là một enum chỉ ra kiểu thay đổi tác
động đến phần tử, bao gồm 4 giá trị: Add, Remove, Name (đối tên), Value
XElement root = new XElement("Root");
XElement lchild = new XElement("LChild","Foo");
XElement rchild = new XElement("RChild","Bar");
Trang 31Changing type: Add
Changing type: Add
Changing type: Name
Changing type: Value
Changing type: Remove
———-<Root>
<RChild>Barrel</RChild>
</Root>
Thêm vào đó, XObject cho phép bạn thêm các chú thích để bổ sung thông
tin cho đối tượng Các thông tin annotation chỉ là tạm thời, không phải là
một phần của tài liệu XML và sẽ không được lưu xuống file Các phương
thức làm việc với chú thích trong XObject:
AddAnnotation Thêm một đối tượng vào danh sách chú thích của XObject
.Annotation(Type) Được các đối tượng chú thích đầu tiên của loại quy định từ
XObject Annotation<T>() Lấy đối tượng chú thích đầu tiên của loại quy định từ
Trang 32XObject Annotations(Type) Được một bộ sưu tập các chú thích của các loại quy định
cho XObject Annotations<T>() Được một bộ sưu tập các chú thích của các loại quy định
cho Xobject
RemoveAnnotations(Type) Loại bỏ các chú thích của các loại quy định từ XObject RemoveAnnotations<T>() Loại bỏ các chú thích của các loại quy định từ Xobject
XAttribute
Một phần tử XML có thể chứa nhiều attribute, mỗi attribute này được đại
diện bởi một đối tượng XAttribute Bạn có thể truy xuất đến các attribute
trước và sau bằng cách dùng hai property PreviousAttribute và
NextAttribute Trong trường hợp attribute là một khai báo namespace,
property IsNamespaceDeclaration sẽ trả về true
XNode
Đại diện cho các phần tử (element, comment, document type, processing
instruction, text node) XNode cho phép bạn truy xuất đến các phần tử
trước và sau với PreviousNode và NextNode
Một đặc điểm quan trọng của XNode là cung cấp các phương thức dùng để
thêm/xóa/sửa các phần tử trong tài liệu XML Các phần tử được thêm vào sẽ có
cùng level với nhau và có cùng phần tử cha
AddAfterSelf(Object) Thêm nội dung quy định ngay lập tức sau nút
AddAfterSelf(Object[]) Thêm nội dung quy định ngay lập tức sau nút
AddBeforeSelf(Object) Thêm nội dung quy định ngay lập tức trước nút
AddBeforeSelf(Object[]) Thêm nội dung quy định ngay lập tức trước nút
Remove Loại bỏ nút này từ cha mẹ của nó
ReplaceWith(Object) Thay thế nút này với nội dung quy định
ReplaceWith(Object[]) Thay thế nút này với nội dung quy định
Ngoài ra còn có các phương thức để duyệt các phần tử trong tài liệu XML như
Ancestors() dùng để lấy về một collection các phần tử có level cao hơn:
Ancestors() Trả về một tập hợp của các yếu tố cha của nút này
Trang 33Ancestors(XName) Trả về một tập hợp lọc của các yếu tố cha của nút này
Các yếu tố chỉ có một XName phù hợp được bao gồm trong tập hợp
ElementsAfterSelf() Trả về một tập hợp của các yếu tố anh chị em sau nút
này
ElementsAfterSelf(XName) Trả về một tập hợp lọc của các yếu tố anh chị em sau nút
này, để tài liệu Các yếu tố chỉ có một XName phù hợp được bao gồm trong tập hợp
ElementsBeforeSelf() Trả về một tập hợp của các yếu tố anh chị em trước nút
này
ElementsBeforeSelf(XName) Trả về một tập hợp lọc của các yếu tố anh chị em trước
nút này, để tài liệu Các yếu tố chỉ có một XName phù hợp được bao gồm trong tập hợp
IsAfter Xác định các nút hiện tại sẽ xuất hiện sau một nút quy
định về trật tự tài liệu
IsBefore Xác định các nút hiện tại sẽ xuất hiện trước một nút quy
định về trật tự tài liệu
NodesAfterSelf Trả về một tập hợp của các yếu tố anh chị em sau nút
này
NodesBeforeSelf Trả về một tập hợp của các yếu tố anh chị em trước nút
này
XText và XComment
Các phần tử này chỉ chứa property Value lưu giá trị của văn bản, chú
thích Một dạng wrapper của string
XContainer
Dùng để chứa các phần tử khác Lớp này cung cấp hai property là
FirstNode và LastNode cho phép truy xuất đến phần tử đầu và cuối Ngoài
ra bổ sung thêm cho lớp XNode các phương thức để thêm phần tử con
vào
Các phương thức mà bạn cần quan tâm của lớp này:
Add(Object) Thêm nội dung con của XContainer
Add(Object[]) Thêm nội dung con của XContainer
Trang 34AddFirst(Object) Thêm nội dung con đầu tiên của XContainer.
AddFirst(Object[]) Thêm nội dung con đầu tiên của XContainer
DescendantNodes Trả về tập hợp các nút con theo thứ tự tăng dần của
XContainer
Descendants() Trả về tập hợp các nút con theo thứ tự tăng dần của
XContainer
Descendants(XName) Trả về tập hợp các nút con theo thứ tự tăng dần của
XContainer.Các yếu tố chỉ có một XName phù hợp được bao gồm trong tập hợp
Element Trả về nút con đầu tiên của specifiedXName
Elements() Trả về nút con đầu tiên của specifiedXName
Elements(XName) Trả về nút con đầu tiên của specifiedXName.Các nút chỉ có
một XName phù hợp được bao gồm trong bộ sưu tập
Nodes Trả về tập hợp các nút con
RemoveNodes Thay thế các nút con
ReplaceNodes(Object) Thay thế các nút con
ReplaceNodes(Object[]) Thay thế các nút con
XElement
Đại diện cho một phần tử, lớp này tương tự như XNode và XContainer, bổ sung
thêm một số thuộc tính và phương thức ví dụ như Attributes() để lấy về các
attribute của phần tử Đặc trưng chính của lớp này là các phương thức Parse,
Load, Save nội dung của văn bản hoặc tập tin thành một phần tử
Ví dụ ta sử dụng Parse() để tạo một phần tử XML từ một đoạn văn bản Hai đối
tượng x1 và x2 sau sẽ tạo ra một phần tử giống nhau:
XElement x1=XElement.Parse("<Blog title=\"Let me know what you
think\"><Name>Yin Yang</Name></Blog>");
XElement x2=new XElement("Blog",
new XAttribute("title","Let me know what you think"),
new XElement("Name","Yin Yang"));
Tài liệu XML được tạo ra từ x1 và x2 trên sẽ có cùng nội dung như sau:
Blog title="Let me know what you think">
<Name>Yin Yang</Name>
</Blog>
Trang 35XDocument là lớp đại diện cho toàn bộ một tài liệu XML Sau đây là một
ví dụ tương đối hoàn chỉnh từ MSDN:
using System;
using System.Linq;
using System.Xml.Linq;
public class Linq2XmlExample {
public static void Main() {
XDocument srcTree = new XDocument(
new XComment("This is a comment"),
new XElement("Root",
new XElement("Child1", "data1"),
new XElement("Child2", "data2"),
new XElement("Child3", "data3"),
new XElement("Child2", "data4"),
new XElement("Info5", "info5"),
new XElement("Info6", "info6"),
new XElement("Info7", "info7"),
new XElement("Info8", "info8")
)
);
XDocument doc = new XDocument(
new XComment("This is a comment"),
Trang 361.8 Xây dựng tòa soạn báo điện tử
Xây dựng một tòa soạn báo điện tử có những tính năng sau :
Lấy tin tự động từ các website khác
Xây dựng font end và back end để quản trị và hiển thị tin tức
LẤY TIN TỰ ĐỘNG
2.1 Tính khả thi của việc lấy tin tự động
2.1.1 Tổng quan
Hệ thống thu thập thông tin là hệ thống thu thập các thông tin của các
trang web trên Internet và đưa vào cơ sở dữ liệu để dành cho việc khai
thác Các thông tin cần thu thập thường được chỉ định trước và là một
phần nội dung của trang web
Một hệ thống thu thập thông tin thường có 2 hệ thống con:
- Hệ thống phân tích cấu trúc của một trang web và cho phép người
dùng rút ra các luật của trang web
- Hệ thống robot tự động đi thu thập thông tin dựa trên các luật đã rút ra
của hệ thống phân tích cấu trúc
1.1 Cơ sở lý thuyết
Vì các trang web rất đa dạng về nội dung và cấu trúc, nên rất khó xác định
chính xác ngữ nghĩa để bóc tách thông tin và do mục tiêu của phân hệ là
thu thập thông tin từ những trang tin tức khác có cấu trúc khá đơn giản và
tương tự nhau nên chúng tôi xin đưa ra một heuristic sau về ngữ nghĩa của
trang web:
“Trong một trang web tin tức, các phần tin trình bày giống nhau sẽ có
ý nghĩa tương tự nhau”.
Heuristic này được rút ra sau khi tôi phân tích rất nhiều trang tin ở Việt
Nam Chúng ta có thể xét một số ví dụ sau:
Trang 37Như chúng ta đã thấy ở các ví dụ trên, các tin có ý nghĩa giống nhau
luôn cố gắng được trình bày tương tự nhau Mục đích của sự tương tự
là nhằm để cho người đọc có thể duyệt tin một cách dễ dàng Và đây chính
là mấu chốt để robot có thể rút trích thông tin một cách tự động từ các
trang web này
1.2 Phương án giải quyết
Heuristic nêu trên chính là mấu chốt để thực hiện việc rút trích thông tin từ
các trang web Với quy luật này chúng ta có thể chuyển đổi thông tin được
định dạng sang thông tin được gắn ngữ nghĩa Ngoài ra, với cấu trúc
chung của trang web tin tức nêu trên, chúng ta hoàn toàn có thể rút trích
toàn bộ thông tin cần thiết cho việc thu thập tin tức
Tuy nhiên để hiện thực hóa quy luật này, chúng ta cần phải giải quyết 2
vấn đề sau:
- Làm thế để lấy được tiêu đề, mô tả, nội dung của tin trong các thẻ html
khi chúng ta lấy được source code của trang đó
Để giải quyết vấn đề này chúng ta sẽ sử dụng Regular Expression để
so khớp với các chuỗi nhằm lấy về được các thông tin mà chúng ta cần
Các tin được trình bày tương tự
Trang 381.3 Kết luận
Với những điểm đã nêu trên, việc thu thập thông tin từ các trang web hoàn
toàn khả thi Và với Regular Expression, chúng ta hoàn toàn có thể mở
rộng, truy vấn với bất kỳ loại trang web nào chứ không riêng gì đối với
những trang tin tức
2.1 Công cụ hỗ trợ việc thu thập tin tức từ các báo điện tử khác
Một tòa soạn điện tử ngoài việc sản xuất tin bài bằng đội ngũ phóng viên
của mình, việc thu thập tin bài từ các báo khác sẽ làm phong phú và đa
dạng hóa tờ báo của mình
Tuy nhiên, việc thu thập tin dựa vào công nghệ XPATH, một công nghệ
đòi hỏi tính chính xác và những yêu cầu nhất định về kiến thức XML
Điều này sẽ là trở ngại đối với những đơn vị muốn lập website nhưng
thiếu nhân lực có chuyên môn về XML và XPATH Chính vì vậy, sự ra
đời của một công cụ có khả năng hỗ trợ lấy tin chỉ bằng những thao tác
đơn giản, trực quan sẽ giúp giải quyết trở ngại trên Từ những lý do trên
cộng với tính khả thi của việc lấy tin tự động từ các website khác, tôi
quyết định xây dựng một công cụ dựa trên Regular Expression.Chúng ta
sẽ sử dụng những biểu thức chính quy để so khớp với các thông tin mà
chúng ta cần lấy
Quá trình lấy tin
2.2.1 RSS
RSS Feed là một tài liệu định dạng XML cho chúng ta có thể độc nội dung
cập nhật thường xuyên thông tin từ một Website, báo điện tử, blog, diênx
đàn… Nó là một trong những tính năng web 2.0 cho phép người dùng đọc
các thông tin liên quan có sẵn trên Internet Tất cả chúng ta cần làm là để
có được URL nguồn cấp dữ liệu RSS
Đây là một ví dụ về một link RSS được hiển thị trên trình duyệt Mozila
Firefox
Trang 39Cấu trúc của chúng như sau:
<pubDate>Wed, 09 May 2012 17:05:09 GMT</pubDate>
<lastBuildDate>Wed, 09 May 2012 17:05:09 GMT</lastBuildDate>
giờ tối nay (9/5), giá bán lẻ xăng A92 sẽ giảm 500 đồng xuống còn 23.300 đồng một
lít trong khi dầu diesel cũng giảm 300 đồng Thuế nhập khẩu xăng dầu tăng từ 0%
lên 3%.<BR />> <A
href="http://vnexpress.net/gl/kinh-doanh/2012/04/gia-xang-len-23-800-dong/">Giá xăng lên 23.800 đồng</A><BR />> <A
Trang 40Superjet-100 của Nga đang bay trình diễn tại Indonesia chiều nay mất tích khỏi hệ
thống radar Sự cố xảy ra ngay trước khi loại máy bay này sang Việt Nam chào
hàng.<BR />> <A
href="http://vnexpress.net/gl/kinh-doanh/2012/05/cong-ty-nga-sang-viet-nam-chao-ban-may-bay/">Công ty Nga sang Việt Nam chào bán máy
bay</A><BR />> <A
href="http://vnexpress.net/gl/kinh-doanh/2012/05/nhieu-hang-muon-dat-hang-may-bay-nga/">Nhiều hãng muốn mua máy bay Nga</A> ]]></description>
a>Dù chưa khẳng định người bị đánh trong clip là hai nhà báo VOV nhưng Chánh văn
phòng UBND tỉnh Hưng Yên thừa nhận, hình ảnh công an đánh người trong clip được
cho là ghi bối cảnh cưỡng chế tại Văn Giang "quá phản cảm".<BR />> <A