Load File XML Bằng C# Và LINQ - ChienTX

Hôm nay, chúng ta sẽ cùng nhau tìm hiểu về cách nạp một tập tin XML vào trong ứng dụng viết bằng C# với sự hỗ trợ của LINQ. Qua đó, các bạn có thể tự tin viết các ứng dụng tương tác với tập tin XML theo mục đích của riêng mình.

Trước hết, các bạn cần phải hiểu sơ lược XML là gì? (Các bạn có thể xem bài giới thiệu tại đây). Nói đơn giản, XML là một tài liệu dạng văn bản mà sử dụng các thẻ được đặt tên để đánh dấu dữ liệu. Ví dụ sau mô tả một tài liệu XML lưu trữ thông tin về các quyển sách

<?xml version="1.0" encoding="UTF-8"?> <books> <book id="B01"> <title>Programming with C#</title> <author>Jackson</author> <price>150</price> </book> <book id="B02"> <title>How to change my life</title> <author>Michael John</author> <price>200</price> </book> </books>

Dòng đầu tiên của một tài liệu XML (không bắt buộc) là dòng chỉ dẫn xử lý (Processing Instruction). Và hầu như mọi tài liệu XML đều có dòng đầu tiên với nội dung giống hệt như vậy, hoặc là với một số thay đổi nhỏ.

Ngay sau chỉ dẫn xử lý sẽ đến nội dung chính của tài liệu XML. Một điều cần lưu ý là một tài liệu XML bất kỳ luôn phải có một thẻ gốc, trong trường hợp này là thẻ <books>. Bạn có thể tưởng tượng một tài liệu XML như là một cái cây và cây này luôn phải có một gốc. Trong cặp thẻ gốc này, chúng ta có thể đặt nhiều thẻ con khác nhau để chứa dữ liệu. Tài liệu XML ở trên có dạng thức giống mô hình cây sau:

image

Bây giờ chúng ta sẽ bắt tay vào công việc chính của bài hôm nay: viết code C# để nạp các thông tin từ tập tin XML trên vào trong chương trình.

Trong Visual Studio, chọn File –> New Project. Trong hộp thoại xuất hiện, chọn ngôn ngữ lập trình là C# và loại ứng dụng là Console Application. Đặt tên cho Project này là LoadXMLProgram

image

Sau đó, chúng ta sẽ thêm vào Project của chúng ta một tập tin XML để sử dụng làm ví dụ cho chương trình. Click chuột phải lên tên của Project trong Solution Explorer, chọn Add –> New Item. Trong cửa sổ hiện ra, chọn XML File, đặt tên của file này là books.xml, nội dung của tập tin này giống như đoạn XML ví dụ ở trên chúng ta vừa xét

image

Một điều cần lưu ý là bởi vì khi chúng ta biên dịch chương trình thì tập tin exe của chúng ta sẽ nằm trong thư mục Debug của project, trong khi tập tin XML mặc định không được copy theo, do đó sẽ dẫn đến lỗi nếu như chúng ta thực hiện biên dịch chương trình. Để khắc phục lỗi này, chúng ta hãy nhấp chuột chọn file books.xml trong Solution Explorer, trong ô Properties, thay đổi giá trị “Copy to Output Directory” thành “Copy if newer” hoặc “Copy Always

image

Để có thể làm việc với file XML dùng LINQ, chúng ta sẽ phải sử dụng các lớp và phương thức có trong namespace System.Xml.Linq. Double click vào tập tin Program.cs trong Solution Explorer và thêm đoạn mã sau vào phần đầu của tập tin nguồn.

using System.Xml.Linq;

Trong hàm Main, chúng ta khai báo một đối tượng của lớp XElement. Đối tượng này sẽ được khởi tạo như sau:

XElement xmlBook = XElement.Open(“books.xml”);

Phương thức tĩnh XElement.Open cho phép chúng ta nạp tập tin XML vào trong bộ nhớ. Trong dòng lệnh trên, chúng ta sử dụng tập tin books.xml nằm cùng thư mục với tập tin thực thi (đến đây thì bạn có thể hiểu rằng tại sao chúng ta phải chỉnh thuộc tính để tập tin books.xml được copy đồng thời với tập tin chương trình khi biên dịch). Đồng thời, đối tượng xmlBook sẽ lưu thông tin về thẻ gốc của tập tin XML này. Lưu ý rằng nếu như file XML của chúng ta không có thẻ gốc, chương trình sẽ phát sinh lỗi như sau:

image

Sau khi đã có được tham chiếu đến thẻ gốc, chúng ta sẽ thực hiện duyệt qua các phần tử Book trong nội dung file XML vừa được nạp vào. Để có thể lưu trữ được các thông tin này, chúng ta sẽ tạo thêm một lớp Book có các dữ liệu sau đây:

class Book { public string Title { get; set; } public string Author { get; set; } public float Price { get; set; } }

Và tiếp đó là phần thú vị nhất trong chương trình. Đoạn mã sau đây sẽ cho phép chúng ta thực hiện duyệt qua các thông tin có trong tập tin books.xml và đưa vào trong một danh sách các Book.

List<Book> books = (from q in xmlBook.Elements("book") select new Book { Title = q.Element("title").Value, Author = q.Element("author").Value, Price = float.Parse(q.Element("price").Value) }).ToList();

Trong đoạn mã trên, chúng ta trước hết tạo ra một List<Book> dùng để chứa thông tin về các Book. Sau đó, chúng ta sử dụng LINQ để duyệt qua các phần tử và đưa nó vào trong danh sách này.

Ghi chú: LINQ (Language-Integrated Query) là một kỹ thuật truy vấn được tích hợp vào trong các ngôn ngữ lập trình .NET nhằm giúp việc viết code và thao tác trên các dữ liệu trở nên dễ dàng hơn. Cú pháp của LINQ gần giống như cú pháp của SQL).

Các bước thực hiện của đoạn mã trên là như sau:

Bước 1: Gọi xmlBook.Elements(“book”), kết quả trả về của lời gọi này là danh sách các thẻ có tên “book” nằm trong thẻ gốc xmlBook và kèm theo các thông tin trong thẻ đó. Dựa vào nội dung của file books.xml mà chúng ta có thể đoán được rằng các thẻ trả về sẽ có những thẻ con là “title”, “author” và “price”.

Bước 2: Duyệt qua từng phần tử trong danh sách thẻ được trả về ở trên (nhờ cấu trúc from q in..), q ở đây là một biến tạm thời dùng để chỉ định phần tử hiện tại trong danh sách (q không cần phải khai báo hay chỉ định kiểu dữ liệu, trình biên dịch đủ thông minh để suy ra được kiểu dữ liệu của q từ kiểu dữ liệu của tập hợp trả về là gì).

Bước 3: Với mỗi phần tử trong danh sách đó, chúng ta thực hiện tạo ra một đối tượng Book với các thông tin tương ứng của phần tử đang xét. Như trong đoạn mã trên, với mỗi thẻ dữ liệu XML được trả về, chúng ta sẽ tạo đối tượng Book với Title, Author và Price là thông tin được chứa trong các thẻ con tương ứng. Lời gọi: q.Element(“title”).Value cho phép chúng ta lấy giá trị được chứa trong thẻ có tên “title” nằm trong q, tương tự đối với “Author” và “Price”. Lưu ý: chúng ta đã khai báo kiểu dữ liệu của Price trong lớp Book là float, do đó bắt buộc chúng ta phải chuyển đổi kiểu dữ liệu string lấy được từ thẻ “Price” về dạng float.

Bước 4: Sau khi đã tạo được một tập hợp các đối tượng Book, chúng ta chuyển đổi tập hợp này sang dạng List để phù hợp với kiểu dữ liệu của  biến books.

Nếu dữ liệu đã được nạp thành công, chúng ta có thể in ra màn hình dữ liệu đó bằng đoạn lệnh sau:

foreach (Book b in books) { Console.WriteLine(b.Title + "-" + b.Author + "-" + b.Price); }

Và chúng ta nhận được kết quả:

image

Như vậy là chúng ta đã hoàn thành việc nạp dữ liệu từ file XML vào trong một ứng dụng viết bằng C# chỉ với vài dòng code với sự trợ giúp của LINQ. LINQ còn được ứng dụng để sử dụng trong các loại dữ liệu khác, ví dụ như LINQ to SQL, LINQ to Object. Nếu biết sử dụng tính năng mới này thì chúng ta có thể giảm đáng kể thời gian rút trích dữ liệu và tập trung vào phần xử lý.

Các bạn có thể download mã nguồn của chương trình này về tại đây.

Chia sẻ:

  • Email
  • Tweet
Thích Đang tải...

Từ khóa » Xml Trong C#