Làm việc với XML trong các ứng dụng .NET. Giới thiệu các công cụ hiện đại để làm việc với XML

Trong bài viết đầu tiên trên blog .NET, “Làm việc với XML”, mọi người trong phần bình luận đã yêu cầu một bài viết về LINQ to XML. Nào chúng ta hãy thử bật mí nguyên lý hoạt động của công nghệ mới này của Microsoft nhé.

Hãy tạo cơ sở để duy trì danh mục các bản ghi âm. Cơ sở dữ liệu sẽ bao gồm các bài hát:

  • Tên
  • Người thi hành
  • Album
  • Khoảng thời gian
Chúng ta sẽ tìm hiểu cách thêm, chỉnh sửa, xóa và thực hiện các lựa chọn khác nhau từ cơ sở dữ liệu của chúng ta.

Đầu tiên, hãy tạo ứng dụng giao diện điều khiển(Tôi viết các dự án của mình bằng C#, nhưng bản chất nhìn chung sẽ rõ ràng với mọi người) và kết nối không gian tên cần thiết

Sử dụng System.Xml.Linq;

Tạo tệp XML

Hãy tạo một tệp XML của cơ sở dữ liệu của chúng tôi chứa một số hồ sơ kiểm trađã sử dụng LINQ:

//đặt đường dẫn đến tệp XML đang hoạt động của chúng ta string fileName = "base.xml"; //bộ đếm số bản nhạc int trackId = 1; //Tạo bởi các hàm tạo lồng nhau. Tài liệu XDocument = new XDocument(new XElement("library", new XElement("track", new XAttribution("id", trackId++), new XAttribution("genre", "Rap"), new XAttribution("time", " 3:24"), XElement mới("tên", "Chúng ta là ai RMX (feat. 2Pac)"), XElement mới("nghệ sĩ", "DMX"), XElement mới("album", "")), XElement mới("track", XAttribution mới ("id", trackId++), XAttribution mới ("thể loại", "Rap"), XAttribution mới ("thời gian", "5:06"), XElement mới ("tên", "Angel (ft. Regina Bell)"), XElement mới("nghệ sĩ", "DMX"), XElement mới("album", "...And Then There Was X")), XElement mới("track", new XAttribution("id", trackId++), new XAttribution("thể loại", "Break Beat"), new XAttribution("time", "6:16"), new XElement("name", "Dreaming Your Dreams") , XElement mới("nghệ sĩ", "Hybrid"), XElement mới("album", "Góc rộng")), XElement mới("track", XAttribution mới ("id", trackId++), XAttribution mới ("thể loại" , "Break Beat"), XAttribution mới ("thời gian", "9:38"), XElement mới ("tên", "Bản giao hưởng đã hoàn thành"), XElement mới ("nghệ sĩ", "Hybrid"), XElement mới (" album", "Góc rộng")))); // lưu tài liệu của chúng tôi doc.Save(fileName);

Bây giờ, sau khi khởi chạy, một tệp XML có nội dung sau sẽ xuất hiện trong thư mục cùng với chương trình của chúng tôi:
Chúng Ta Là Ai RMX (feat. 2Pac) DMX Mixtape Dogz: Ai là người tiếp theo?! Thiên thần (ft. Regina Bell) DMX ...Và rồi có X Mơ những giấc mơ của bạn Hỗn hợp Góc rộng Bản giao hưởng đã hoàn thành Hỗn hợp Góc rộng

Để tạo một tệp như vậy bằng XmlDocument, mã cần gấp khoảng 2 lần. Trong đoạn mã trên, chúng ta đã sử dụng hàm tạo của lớp XDocument, lớp này lấy tham số là danh sách các phần tử con mà ban đầu chúng ta muốn khởi tạo tài liệu. Hàm tạo XElement được sử dụng lấy tham số là tên của phần tử mà chúng ta đang tạo, cũng như danh sách các phần tử khởi tạo. Để thuận tiện, chúng ta có thể đặt cả XElement và XAttribution mới trong các phần tử này. Cái sau sẽ được hiển thị vào tệp của chúng tôi dưới dạng các thuộc tính một cách độc lập. Nếu bạn không thích sử dụng các hàm tạo lồng nhau như vậy và bạn cho rằng mã đó cồng kềnh thì bạn có thể viết lại nó trong một phiên bản truyền thống hơn. Đoạn mã bên dưới sẽ xuất ra một tệp XML tương tự:

Tài liệu XDocument = XDocument mới(); Thư viện XElement = XElement mới ("thư viện"); doc.Add(thư viện); //tạo phần tử "track" XElement track = new XElement("track"); //thêm các thuộc tính cần thiết track.Add(new XAttribution("id", 1)); track.Add(new XAttribution("thể loại", "Rap")); track.Add(new XAttribution("time", "3:24")); //tạo phần tử "name" XElement name = new XElement("name"); name.Value = "Chúng ta là ai RMX (feat. 2Pac)"; track.Add(name); //создаем элемент "artist" XElement artist = new XElement("artist"); artist.Value = "DMX"; track.Add(artist); //Для разнообразия распарсим элемент "album" string albumData = "!} Mixtape Dogz: Ai là người tiếp theo?!"; XElement album = XElement.Parse(albumData); track.Add(album); doc.Root.Add(track); /* *thêm các phần tử còn lại theo cách tương tự */ //lưu tài liệu của chúng tôi doc.Save( tên tệp);

Đương nhiên, bạn cần chọn phương pháp cần thiết tùy theo tình huống.

Đọc dữ liệu từ một tập tin

//đặt đường dẫn đến tệp XML đang hoạt động của chúng ta string fileName = "base.xml"; //đọc dữ liệu từ file XDocument doc = XDocument.Load(fileName); //chúng ta duyệt qua từng phần tử trong thư viện mới //(phần tử này có thể truy cập ngay lập tức thông qua thuộc tính doc.Root) foreach (XElement el in doc.Root.Elements()) ( // Xuất tên của phần tử và giá trị của thuộc tính id Console.WriteLine(" (0) (1)", el.Name, el.Attribution("id").Value); Console.WriteLine(" Thuộc tính:"); //chúng tôi hiển thị tất cả các thuộc tính trong một vòng lặp, đồng thời xem cách chúng tự chuyển đổi thành chuỗi foreach (XAttr attr in el.Attribution()) Console.WriteLine(" (0)", attr); Console.WriteLine(" Elements:") ; // lặp lại tên của tất cả các phần tử con và giá trị của chúng foreach (Phần tử XElement trong el.Elements()) Console.WriteLine(" (0): (1)", element.Name, element.Value); )

Tôi nghĩ ở đây trong mã không có gì phức tạp và các nhận xét đều được cung cấp. Sau khi chạy chương trình của chúng tôi, kết quả sau sẽ được hiển thị trong bảng điều khiển:

Thuộc tính bản nhạc 1: id="1" thể loại="Rap" time="3:24" Thành phần: tên: Who We Be RMX (feat. 2Pac) nghệ sĩ: Album DMX: The Dogz Mixtape: Who's Next?! 2 Thuộc tính: id="2" thể loại="Rap" time="5:06" Thành phần: tên: Angel (ft. Regina Bell) nghệ sĩ: Album DMX: ...And Then There Was X track 3 Thuộc tính: id= "3" thể loại="Break Beat" time="6:16" Thành phần: tên: Dreaming Your Dreams nghệ sĩ: Album kết hợp: Bản nhạc Wide Angle 4 Thuộc tính: id="4" thể loại="Break Beat" time="9: 38" Elements: tên: Bản giao hưởng đã hoàn thành Nghệ sĩ: Album lai: Wide Angle

Thay đổi dữ liệu

Hãy thử xem qua tất cả các nút thư viện và tăng thuộc tính Id của phần tử bản nhạc lên 1.
(Tôi sẽ không viết thêm phần khai báo đường dẫn đến tệp và kết quả xuất ra bảng điều khiển, để không làm quá tải bài viết với những thông tin không cần thiết, tôi đã biên soạn mọi thứ, mọi thứ đều hoạt động :)):

//Lấy nút con đầu tiên từ thư viện XNode node = doc.Root.FirstNode; while (node ​​!= null) ( //kiểm tra xem nút hiện tại có phải là một phần tử không if (node.NodeType == System.Xml.XmlNodeType.Element) ( XElement el = (XElement)node; //lấy giá trị của thuộc tính id và chuyển đổi nó trong Int32 int id = Int32.Parse(el.Attribution("id").Value); // tăng bộ đếm lên một và gán lại giá trị id++;el.Attribution("id"). Value = id.ToString() ; ) //chuyển sang nút tiếp theo node = node.NextNode; ) doc.Save(fileName);

Bây giờ hãy thử thực hiện điều này theo cách chính xác hơn cho nhiệm vụ của chúng ta:

Foreach (XElement el in doc.Root.Elements("track")) ( int id = Int32.Parse(el.Attribution("id").Value); el.SetAttributionValue("id", --id); ) doc.Save(fileName);

Như bạn có thể thấy, phương pháp này phù hợp với chúng tôi hơn.

Thêm một mục mới

Hãy thêm một bản nhạc mới vào thư viện của chúng ta, đồng thời tính Id duy nhất sau đây cho bản nhạc bằng LINQ:

Int maxId = doc.Root.Elements("track").Max(t => Int32.Parse(t.Attribution("id").Value)); Track XElement = new XElement("track", XAttribution mới("id", ++maxId), XAttribution mới("thể loại", "Break Beat"), XAttribution mới ("thời gian", "5:35"), mới XElement("name", "Cao hơn một tòa nhà chọc trời"), XElement mới("nghệ sĩ", "Hybrid"), XElement mới("album", "Khoa học viễn tưởng buổi sáng")); doc.Root.Add(track); doc.Save(fileName);

Với truy vấn nâng cao như vậy đối với tất cả các phần tử, giá trị tối đa của thuộc tính id của các bản nhạc sẽ được tính toán. Khi thêm, chúng tôi tăng giá trị tối đa kết quả. Việc thêm một phần tử chính là gọi phương thức Add. Xin lưu ý rằng chúng tôi đang thêm các phần tử vào Root, vì nếu không chúng tôi sẽ phá vỡ cấu trúc của tài liệu XML bằng cách khai báo 2 phần tử gốc ở đó. Ngoài ra, đừng quên lưu tài liệu của bạn vào đĩa, vì cho đến khi lưu, không có thay đổi nào trong XDocument của chúng tôi sẽ được phản ánh trong tệp XML.

Xóa các mục

Hãy thử xóa tất cả các yếu tố nghệ sĩ DMX:

IE có thể đếm được track = doc.Root.Descendants("track"). Where(t => t.Element("artist").Value == "DMX").ToList(); foreach (XElement t in tracks) t.Remove(); !}

Trong ví dụ này, trước tiên chúng tôi chọn tất cả các bản nhạc có phần tử con artst đáp ứng tiêu chí, sau đó xóa các phần tử này trong một vòng lặp. Lệnh gọi ToList() ở cuối lựa chọn là quan trọng. Bằng cách này, chúng tôi ghi lại vào một vùng bộ nhớ riêng tất cả các phần tử mà chúng tôi muốn xóa. Nếu chúng tôi quyết định xóa khỏi tập hợp các bản ghi mà chúng tôi đang xem trực tiếp trong vòng lặp, chúng tôi sẽ loại bỏ phần tử đầu tiên và NullReferenceException tiếp theo. Vì vậy, điều quan trọng là phải nhớ điều này.
Theo lời khuyên của xaoccps, bạn có thể xóa thêm một cách đơn giản:
IE có thể đếm được track = doc.Root.Descendants("track"). Where(t => t.Element("artist").Value == "DMX"); tracks.Remove(); !}
Trong trường hợp này, không cần phải chuyển kết quả thu được thành danh sách bằng cách gọi hàm ToList(). Tại sao phương pháp này ban đầu không được mô tả trong

Cập nhật lần cuối: 31/10/2015

Có một số cách tiếp cận bạn có thể sử dụng để làm việc với XML trong C#. Trong các phiên bản đầu tiên của khung công tác này, chức năng chính để làm việc với XML được cung cấp bởi không gian tên System.Xml. Nó định nghĩa một số lớp cho phép bạn thao tác trên một tài liệu xml:

    XmlNode: Đại diện cho nút xml. Toàn bộ tài liệu hoặc một phần tử riêng biệt có thể được sử dụng làm nút

    XmlDocument : đại diện cho toàn bộ tài liệu xml

    XmlElement: Đại diện cho một phần tử duy nhất. Kế thừa từ lớp XmlNode

    XmlAttribution: Đại diện cho một thuộc tính phần tử

    XmlText: biểu thị giá trị của một phần tử dưới dạng văn bản, nghĩa là văn bản xuất hiện trong phần tử giữa thẻ mở và thẻ đóng của nó

    XmlComment : đại diện cho một bình luận trong xml

    XmlNodeList: dùng để làm việc với danh sách các nút

Lớp khóa cho phép bạn thao tác nội dung xml là XmlNode, vì vậy hãy xem xét một số phương thức và thuộc tính chính của nó:

    Thuộc tính Thuộc tính trả về một đối tượng XmlAttributionCollection đại diện cho một tập hợp các thuộc tính

    Thuộc tính ChildNodes trả về tập hợp các nút con cho một nút nhất định

    Thuộc tính HasChildNodes trả về true nếu nút hiện tại có các nút con

    Thuộc tính FirstChild trả về nút con đầu tiên

    Thuộc tính LastChild trả về nút con cuối cùng

    Thuộc tính InnerText trả về giá trị văn bản của nút

    Thuộc tính InnerXml trả về tất cả đánh dấu nội bộ nút xml

    Thuộc tính Name trả về tên của nút. Ví dụ, - giá trị của thuộc tính Tên là "người dùng"

    Thuộc tính ParentNode trả về nút cha của nút hiện tại

Hãy áp dụng các lớp này và chức năng của chúng. Và đầu tiên, để làm việc với xml, hãy tạo tập tin mới. Hãy gọi cho anh ấy người dùng.xml và xác định nội dung sau trong đó:

Microsoft 48 Google 42

Bây giờ chúng ta hãy xem qua tài liệu này và xuất dữ liệu của nó ra bảng điều khiển:

Sử dụng System.Xml; Chương trình lớp ( static void Main(string args) ( XmlDocument xDoc = new XmlDocument(); xDoc.Load("users.xml"); // lấy phần tử gốc XmlElement xRoot = xDoc.DocumentElement; // duyệt qua tất cả các nút trong phần tử gốc foreach(XmlNode xnode in xRoot) ( // lấy thuộc tính tên if(xnode.Attribution.Count>0) ( XmlNode attr = xnode.Attribut.GetNamedItem("name"); if (attr!=null) Console. WriteLine(attr .Value); ) // duyệt qua tất cả các nút con của phần tử user foreach(XmlNode childnode in xnode.ChildNodes) ( // nếu nút là company if(childnode.Name=="company") ( Console.WriteLine ("Company: (0 )", childnode.InnerText); ) // nếu nút ở tuổi if (childnode.Name == "age") ( Console.WriteLine("Age: (0)", childnode.InnerText) ; ) ) Console.WriteLine() ; ) Console.Read(); ) )

Kết quả là tôi sẽ nhận được kết quả đầu ra sau trên bảng điều khiển:

Để bắt đầu làm việc với một tài liệu xml, chúng ta cần tạo một đối tượng XmlDocument rồi tải một tệp xml vào đó: xDoc.Load("users.xml");

Khi phân tích cú pháp xml, trước tiên chúng ta lấy phần tử gốc của tài liệu bằng thuộc tính xDoc.DocumentElement. Tiếp theo, quá trình phân tích cú pháp thực sự của các nút tài liệu diễn ra.

Trong vòng lặp foreach(XmlNode xnode in xRoot) chúng ta duyệt qua tất cả các nút con của phần tử gốc. Bởi vì các nút con đại diện cho các phần tử , thì chúng ta có thể lấy các thuộc tính của chúng: XmlNode attr = xnode.Attribut.GetNamedItem("name"); và các phần tử lồng nhau: foreach(XmlNode childnode in xnode.ChildNodes)

Để xác định loại nút nào ở phía trước, chúng ta có thể so sánh tên của nó: if(childnode.Name=="company")

Theo cách tương tự, chúng ta có thể tạo đối tượng Người dùng từ dữ liệu xml:

Danh sách người dùng = Danh sách mới (); XmlDocument xDoc = new XmlDocument(); xDoc.Load("users.xml"); XmlElement xRoot = xDoc.DocumentElement; foreach(XmlElement xnode trong xRoot) ( User user = new User(); XmlNode attr = xnode.Attribut.GetNamedItem("name"); if (attr!=null) user.Name=attr.Value; foreach (XmlNode childnode in xnode.ChildNodes) ( if (childnode.Name == "company") user.Company=childnode.InnerText; if (childnode.Name == "age") user.Age = Int32.Parse(childnode.InnerText); ) người dùng .Add(user); ) foreach (Người dùng u trong người dùng) Console.WriteLine("(0) ((1)) - (2)", u.Name, u.Company, u.Age);

Chúng tôi xin giới thiệu với bạn một khóa học mới của nhóm Codeby- "Thử nghiệm thâm nhập các ứng dụng Web từ đầu." Lý thuyết chung, chuẩn bị môi trường làm việc, làm mờ và lấy dấu vân tay thụ động, làm mờ chủ động, Lỗ hổng, Hậu khai thác, Công cụ, Kỹ thuật xã hội và nhiều hơn thế nữa.


XML DOM 2

Bài viết trước đã mô tả các khái niệm chung về XML. Trong bài viết này chúng ta sẽ tìm hiểu cách thực hiện các thao tác cơ bản liên quan đến thay đổi, thêm, tìm kiếm trong một tệp XML.

Tệp XML được sử dụng cho ví dụ.

Mazda 2007 xe BMW 2009

tên miền xml

Hiện tại, tệp của chúng tôi chứa cấu trúc sau:

Mối quan hệ giữa các nút trong DOM XML, khoảnh khắc cơ bản:

1. Bất kỳ nút nào trong cây DOM đều có ParentNode gốc. Trong ví dụ của chúng tôi, gara là cha mẹ của cả hai phần tử ô tô và cả hai phần tử ô tô lần lượt là cha mẹ của các phần tử mô hình và năm.

Làm cách nào để lấy phần tử gốc của phần tử xml ô tô?

Console.WriteLine(elmRoot["car"].ParentNode.Name); //Kết quả: gara

2. Cha mẹ có thể có con ChildNodes. Ví dụ, đối với nút gara, cả hai phần tử con đều là ô tô. Các chi tiết ô tô cũng có mẫu mã và năm dành cho trẻ em.

Nút con, là một bộ sưu tập lưu trữ tất cả các phần tử xml con; để truy cập phần tử mong muốn, bạn cần chỉ định chỉ mục của nó. (Chỉ số luôn bắt đầu từ số 0!)

Ví dụ: làm thế nào để lấy phần tử con đầu tiên?

ElmRoot.ChildNodes;

3. Cũng như trong cuộc sống bình thường, một đứa trẻ có thể được sinh ra là Con đầu lòng hoặc Con cuối cùng.

Nếu chúng ta lấy phần tử ô tô làm ví dụ thì

FirstChild là mẫu LastChild là năm

4. Ngược lại, giữa các yếu tố con cũng có mối liên hệ, có thể là anh chị em nếu chúng ta so sánh với đời thực.

Ví dụ, một đứa trẻ có thể có anh chị em ruột trước đây và anh chị em ruột kế tiếp

Console.WriteLine(elmRoot.ChildNodes.FirstChild.NextSibling.Name); //Kết quả: năm Console.WriteLine(elmRoot.ChildNodes.LastChild.PreviousSibling.Name); //Kết quả: mô hình

Nếu không tìm thấy phần tử thì một ngoại lệ sẽ được đưa ra: NullReferenceException, vì vậy khi làm việc với xml, hãy luôn sử dụng các khối thử bắt.

Console.WriteLine(elmRoot.ChildNodes. LastChild.NextSibling.Name); Console.WriteLine(elmRoot.ChildNodes. FirstChild.PreviousSibling.Name);

LastChild là NextSibling;
FirstChild là Anh chị em trước đó;

Sử dụng các phương pháp được mô tả ở trên, bạn có thể dễ dàng di chuyển đến nút mong muốn và nhận bất kỳ giá trị nào bạn cần.

Làm cách nào để lấy giá trị của phần tử xml?

Giá trị xml của một phần tử có thể được lấy bằng thuộc tính InnerText, ví dụ:

Console.WriteLine(elmRoot["car"].FirstChild.InnerText); //Kết quả: Mazda

Một cách khác để có cùng giá trị phần tử xml:

Console.WriteLine(elmRoot.FirstChild.FirstChild.InnerText); // Kết quả: Mazda

Trình tự các chuyển động dọc theo cây DOM:

Garage -> ô tô -> mẫu xe -> Mazda

Chúng tôi nhận được năm:

ElmRoot["xe"].LastChild.InnerText; // Kết quả: 2007

Tiếp theo:

Gara -> xe -> năm -> 2007

Một ví dụ khác: 3 cách để có được kết quả tương tự.

Console.WriteLine(elmRoot.LastChild.FirstChild.InnerText); Console.WriteLine(elmRoot["car"].NextSibling.FirstChild.InnerText); Console.WriteLine(elmRoot.ChildNodes.Item(1).FirstChild.InnerText); //Kết quả: BMW

Nếu bạn cần lấy năm cho một phần tử có giá trị Mazda:

Console.WriteLine(elmRoot.FirstChild.LastChild.InnerText); //Kết quả: 2007

Đối với BMW (hai cách, nhận được kết quả tương tự)

Console.WriteLine(elmRoot.ChildNodes.Item(1).ChildNodes.Item(1).InnerText); Console.WriteLine(elmRoot.ChildNodes.ChildNodes.InnerText); //Kết quả: 2009

Làm cách nào để thay đổi giá trị phần tử xml?

Sử dụng tài sản Nội văn() Bạn có thể vừa nhận vừa thay đổi giá trị của một phần tử xml, chẳng hạn như thay đổi năm.

// Đặt giá trị mới elmRoot.FirstChild.LastChild.InnerText = "2010"; //Hiển thị giá trị mới trên màn hình bảng điều khiển Console.WriteLine(elmRoot.FirstChild.ChildNodes.Item(1).InnerText); //Kết quả: 2010

Đồng thời, bạn cần nhớ rằng tất cả các thay đổi đều xảy ra với tệp xml ảo, nếu bạn mở tệp vật lý, bạn sẽ thấy năm 2007 vẫn được ghi trong đó.

Để các thay đổi có hiệu lực, bạn cần sử dụng phương thức Save, ví dụ:

ElmRoot.Save("tên tệp hoặc luồng xml");

Bây giờ thông tin sẽ được thay đổi trong tệp xml “vật lý”.

Làm thế nào để có được số phần tử con?

Console.WriteLine(elmRoot.FirstChild.ChildNodes.Count);

gara -> xe chứa 2 con: model và năm

Console.WriteLine(elmRoot.FirstChild.FirstChild.ChildNodes.Count);

gara -> ô tô -> mô hình chứa 1 phần tử xml con.

Truy cập các phần tử con

theo chỉ mục

ElmRoot.ChildNodes.Name; elmRoot.ChildNodes.Name; //Kết quả: ô tô

Sử dụng một vòng lặp

Foreach (XmlNode gật đầu trong elmRoot.ChildNodes) ( Console.WriteLine(nod.Name); ) //Kết quả: car, car

Làm cách nào để lấy tên phần tử xml?

elmRoot.Name; //Kết quả: gara

Tạo một phần tử XML mới

Hãy tạo một phần tử mới trong tài liệu XML của chúng ta để nó khác với hai phần tử còn lại (ô tô), hãy gọi nó là xe buýt (xe buýt).

Khi tạo một phần tử mới, chúng tôi sẽ sử dụng đề xuất từ ​​trang web msdn và thay vì XmlElement mới tiêu chuẩn, chúng tôi sẽ sử dụng phương thức CreateElement.

XmlElement elm = xmlDoc.CreateElement("bus");

Tạo và thêm phần tử xml mới

Hãy tạo một phần tử xml mới có tên là "BUS".

XmlElement elmRoot = xmlDoc.DocumentElement; Console.WriteLine(elmRoot.ChildNodes.Count); //car, car XmlElement elmNew = xmlDoc.CreateElement("bus"); elmRoot.AppendChild(elmNew); Console.WriteLine(elmRoot.ChildNodes.Count); //3 ô tô, ô tô, xe buýt xmlDoc.Save("tên file xml");

Giải trình:

1. Đầu tiên chúng ta lấy phần tử gốc mà chúng ta sẽ đính kèm các phần tử mới vào đó.

2. Để kiểm tra, chúng tôi sẽ hiển thị số phần tử con hiện tại của phần tử gara: 2 (ô tô và ô tô)

3. Tạo phần tử BUS mới

4. Sử dụng phương pháp Nối thêm con thêm một phần tử mới vào cây

5. Hãy sử dụng phép kiểm tra lại và hiển thị số phần tử hiện tại cho phần tử gara, lúc này có 3 phần tử: ô tô, ô tô, xe buýt.

6. Để những thay đổi ảnh hưởng đến tệp vật lý, hãy lưu

Trong chính tệp XML, phần tử mới sẽ trông như thế này:

Làm cách nào để thêm phần tử xml mới?

Nhiệm vụ: tạo một phần tử XML mới và thêm một số nội dung văn bản vào đó, ví dụ như năm sản xuất.

Chuỗi strFilename = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmNew = xmlDoc.CreateElement("bus"); XmlText new_txt = xmlDoc.CreateTextNode("2006"); elmRoot.AppendChild(elmNew); elmRoot.LastChild.AppendChild(new_txt); Console.WriteLine(elmRoot.ChildNodes.Name); //bus Console.WriteLine(elmRoot.ChildNodes.LastChild.InnerText); //2006 Console.Read();

Trong tệp XML:

2006

Cho rõ ràng

Bây giờ, hãy tạo một nút “xe buýt” có kiến ​​trúc giống như ô tô, nghĩa là thêm các nút: kiểu xe, năm và một số nội dung văn bản.

Tạo một phần tử XML với trẻ em

chuỗi strFilename = @"C:\lessons\Auto.xml"; //tạo một tài liệu xml mới trong bộ nhớ XmlDocument xmlDoc = new XmlDocument(); //tải file xml vào bộ nhớ xmlDoc.Load(strFilename); //Lấy phần tử gốc XmlElement elmRoot = xmlDoc.DocumentElement; //Tạo 3 phần tử: bus, model, năm XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("year"); //Đặt giá trị cho các phần tử: model, Year XmlText Year_txt = xmlDoc.CreateTextNode("2006"); //XmlText mod_txt = xmlDoc.CreateTextNode("liaz"); thêm cách khác //Thêm hai phần tử con vào phần tử bus: model và năm elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); //Thêm giá trị vào mô hình và nút năm elmModel.InnerText = "liaz"; elmYear.AppendChild(year_txt); //Thêm một bus phần tử xml mới vào cây elmRoot.AppendChild(elmBUS); //Kiểm tra xem mọi thứ đã được thêm vào như bình thường chưa Console.WriteLine(elmRoot.ChildNodes.FirstChild.InnerText); Console.WriteLine(elmRoot.LastChild.LastChild.InnerText); // Nếu mọi thứ đều ổn thì sử dụng phương thức Lưu xmlDoc.Save("tên tệp xml");

Kết quả:

cây tử đinh hương 2006

Làm cách nào tôi có thể rút ngắn mã này? Ví dụ như sau:

Chuỗi PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("year"); //Thêm giá trị vào mô hình và nút năm elmModel.InnerText = "liaz"; elmYear.InnerText = "2006"; elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); elmRoot.AppendChild(elmBUS); // Nếu mọi thứ đều chính xác thì hãy gọi phương thức Lưu xmlDoc.Save("tên tệp xml");

Hãy rút ngắn mã thêm một chút, để làm điều này, chúng ta sẽ sử dụng thuộc tính InnerXml:

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmXML = xmlDoc.CreateElement("bus"); chuỗi txt = " cây tử đinh hương" + "2006"; //InnerXml! elmXML.InnerXml = txt; //xmlDoc.DocumentElement (sẽ bằng gara) - đây là một cách khác để truy cập phần tử gốc, giống như XmlElement elmRoot = xmlDoc.DocumentElement; xmlDoc.DocumentElement.AppendChild ( elmXML); xmlDoc.Save(PathXmlFile);

Kết quả

Nhận danh sách các phần tử bằng GetElementByTagName

GetElementByTagName trả về Danh sách XmlNode, chứa tất cả các phần tử con thuộc về phần tử được chỉ định, ví dụ: chúng ta cần lấy tất cả các mẫu ô tô được lưu trữ trong gara:

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); foreach (nút XmlNode trong modelName) ( Console.WriteLine(node.InnerText); ) //Kết quả: mazda, bmw, liaz

Truy cập bằng chỉ mục:

Chuỗi PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); // Kết quả: liaz

Làm cách nào tôi có thể thay đổi nội dung văn bản của phần tử "bus" mới được tạo bằng phương thức GetElementByTagName?

Chuỗi PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); //Nhận được giá trị: liaz

Hoặc bạn có thể đổi tên liaz thành Ikarus

Console.WriteLine(modelName.InnerText = "Ikarus");

Ngôn ngữ không phải là đứa con mà là cha của tư duy.
Oscar Wilde

Viết tắt XML là viết tắt của Extensible Markup Language, được dịch là “ngôn ngữ đánh dấu mở rộng”. Giống như HTML, nó là một tập hợp con của SGML (Ngôn ngữ đánh dấu chung tiêu chuẩn), “ông tổ” của các ngôn ngữ đánh dấu. Chúng tôi đã gặp định dạng XML nhiều lần. Đây là định dạng của tệp cấu hình, tệp mô tả nguồn dữ liệu đối tượng.

XML là một tiêu chuẩn phổ quát, độc lập với nền tảng để mô tả thông tin có thể được sử dụng để thể hiện dữ liệu phân cấp và thống nhất thông tin được truyền đi. Nếu không có kiến ​​thức về nó thì không thể hiểu được SOAP và do đó không thể hiểu được các dịch vụ web. XML đã trở thành tiêu chuẩn thực tế cho việc truyền dữ liệu trên Internet. Tiêu chuẩn XML và các định dạng liên quan được xác định bởi W3C (World Wide Web Consortium). Ví dụ: chúng tôi tạo các trang aspx ở định dạng XHTML - chuyển tiếp giữa HTML và XML, tiêu chuẩn của trang này cũng được xác định bởi W3C. Tiêu chuẩn XHTML áp đặt các quy tắc chặt chẽ hơn về cách hình thành tài liệu chính xác, tương tự như các quy tắc của XML.

Hãy hiểu sự khác biệt chính giữa XML và HTML. XML được thiết kế để mô tả dữ liệu và tập trung vào chính xác dữ liệu đó là gì. HTML được thiết kế để hiển thị dữ liệu và tập trung vào cách dữ liệu trông như thế nào. Nếu trong HTML truyền thống các khái niệm “trình bày” và “trực quan hóa” thường bị nhầm lẫn thì khi làm việc với XML chúng ta tách biệt rõ ràng các khái niệm này. Các thẻ XML không được người tạo ra ngôn ngữ xác định trước, không giống như các thẻ HTML. Mỗi tác giả tài liệu xác định các thẻ riêng của mình.

Tiêu chuẩn yêu cầu chương trình xử lý tài liệu XML phải dừng nếu gặp lỗi. Và nếu trình duyệt phát hiện một thẻ không rõ ràng trong HTML hoặc thiếu thẻ đóng, nó sẽ bỏ qua thẻ đó.

Ở phần đầu của một tài liệu XML, phần khai báo hoặc phần mở đầu của nó luôn xuất hiện. Nó chỉ định phiên bản của tiêu chuẩn XML mà nó tuân thủ.

là một lỗi trong XML.

Thẻ có thể có thuộc tính. Giá trị thuộc tính phải được đặt trong dấu ngoặc kép. Thứ tự của các thuộc tính không quan trọng. Có thể có văn bản giữa thẻ mở và thẻ đóng. XML bảo tồn tất cả khoảng trắng được tìm thấy trong văn bản. Nếu không có văn bản, bạn có thể sử dụng dạng ký hiệu viết tắt. Thẻ XML mẫu:

Đây là dạng ngắn của thẻ

Điều này có nhắc nhở bạn điều gì không? Các quy tắc mô tả các phần tử ASP.NET hoàn toàn giống nhau.

Có thuộc tính xmlns xác định không gian tên. Giá trị của nó có thể là bất kỳ tên duy nhất nào. Có thỏa thuận sử dụng URL vì chúng là duy nhất. Không gian tên có ý nghĩa tương tự như cách chúng được sử dụng trong .NET Framework - để tránh nhầm lẫn các tên tương tự được các nhà phát triển khác nhau sử dụng. Tên không gian tên được phân tách khỏi tên bằng dấu hai chấm.

Các tệp XML thể hiện thông tin phân cấp có thể được biểu diễn dưới dạng cây có một gốc duy nhất.

Các tài liệu XML đáp ứng tất cả các yêu cầu về cú pháp được gọi là đúng định dạng. Để mô tả dữ liệu, XML sử dụng DTD (Document Type Definition) - định nghĩa về loại tài liệu. Nếu tệp khớp với DTD, nó được coi là hợp lệ.

Các trình duyệt IE 6.0, FireFox 1.5 hiển thị các tệp XML có tô sáng cú pháp. Các nút cha có thể được mở rộng và đóng lại. Ví dụ: khi đóng, nút gốc của tệp BirthDay.xml trông như thế này:

Môi trường phát triển Visual Studio và VWD Express kiểm tra tính chính xác của tài liệu xml ngay trong quá trình chỉnh sửa.

Công cụ quay vòng quảng cáo

Phần tử điều khiển Công cụ quay vòng quảng cáo cho phép bạn hiển thị các biểu ngữ quảng cáo và tự động thay thế chúng bằng các biểu ngữ khác. Bản thân các biểu ngữ được mô tả trong tệp XML hoặc nguồn dữ liệu khác. Quảng cáo được cập nhật mỗi khi trang được làm mới. Thuộc tính AdvertismentFile chỉ định tên của tệp XML. Bộ xương của một tệp XML như sau.

Bên trong nút Quảng cáo có các nút

Các nút này có 5 thuộc tính, tất cả đều là tùy chọn.

Một ví dụ về tệp AdvertismentFile, tệp này có tên là ads.xml.

đã sửa.gif http://www.im.am Lưu trữ miễn phí 40 lưu trữ logo2.jpg http://www.nv.am Báo "Thời gian mới" 50 Tin tức mùa hè.jpg http://www.utro.ru Ca sĩ Jasmine bị chồng đánh! 100 tin tức màu vàng

Một phần tử điều khiển được đặt trên trang. Thuộc tính Quảng cáo của nó trỏ tới tệp này.

Nếu thuộc tính Từ khóa được đặt, điều khiển chỉ hiển thị các quảng cáo phù hợp với nội dung của nó. Vì nó có thể được thay đổi linh hoạt nên quảng cáo có thể được điều chỉnh theo nhu cầu của người dùng. Từ khóa phải xuất hiện ít nhất một lần trong tệp quảng cáo, nếu không sẽ có hình chữ nhật trống thay vì quảng cáo.

Trong các phiên bản trước của ASP.NET, bạn chỉ có thể làm việc với các tệp XML. Bây giờ bạn có thể sử dụng bất kỳ nguồn dữ liệu nào bằng cách liên kết với điều khiển nguồn dữ liệu. Trong trường hợp này, bạn phải chỉ định ít nhất 3 trường nguồn trong thuộc tính ImageUrlField, NavigateUrlField và AlternateTextField.

Tệp chuyển đổi tài liệu

Được biết, CSS (Cascading Stylesheets) thường được sử dụng để định dạng tệp HTML, mặc dù điều này không cần thiết vì trình duyệt liên kết một diện mạo nhất định với tất cả các thẻ. Yếu tố

Đặt đoạn văn - phông chữ đậm - trình duyệt biết cách hiển thị chúng.

Vì XML không sử dụng các thẻ được xác định trước nên ý nghĩa của chúng có thể là bất kỳ thứ gì:

có thể có nghĩa là một bảng HTML hoặc có thể có nghĩa là một cái bàn bằng gỗ. Do đó, trình duyệt hiển thị tài liệu XML "nguyên trạng". Bạn cũng có thể chỉ định tệp CSS cho tài liệu XML, nhưng điều này không được khuyến khích.

Để thiết lập định dạng hiển thị của tài liệu XML, người ta sử dụng các biểu định kiểu XSL. XSL- Ngôn ngữ biểu định kiểu mở rộng có khả năng phong phú hơn nhiều so với CSS. XSL không chỉ là một biểu định kiểu.

Cùng một tệp XML có thể được liên kết với các bảng XSL khác nhau, kể cả theo cách lập trình.

XSL gồm có 3 phần:

  1. XSLT - một phương pháp chuyển đổi tài liệu XML
  2. XPath - một phương pháp xác định các phần và đường dẫn tới các phần tử XML
  3. Đối tượng định dạng XSL - phương pháp định dạng tài liệu XML

Phần quan trọng nhất của XSL là ngôn ngữ Chuyển đổi XSLT. Nó được sử dụng để chuyển đổi tài liệu XSL thành các loại tài liệu khác hoặc tài liệu XSL khác. XSLT thường được sử dụng để chuyển đổi tài liệu XSL sang định dạng HTML.

Để tạo tài liệu XSLT, hãy chọn tệp XSLT trong hộp thoại tạo tệp. VS 2005 tạo ra một khung biểu định kiểu. Vì bản thân một bảng định kiểu là một tài liệu XML nên nó bắt đầu bằng một khai báo XML.

Nếu bạn đã học CSS, bạn biết rằng các quy tắc về kiểu dáng được sử dụng. Một quy tắc bao gồm một bộ chọn và một câu lệnh kiểu trong dấu ngoặc nhọn.

Thẻ này chứa một tệp HTML mẫu. Nhận xét nhắc nhở bạn rằng bạn cần chèn các phần tử XSL vào đó.

Hãy xem xét việc tạo tệp XSLT bằng một ví dụ. Tạo tệp XML "Quotes.xml" trong thư mục App_Data

Chúng tôi muốn điều tốt nhất, nhưng nó lại diễn ra như mọi khi. Victor Chernomyrdin Châu Mỹ được đặt tên như vậy vì Columbus đã phát hiện ra nó. Georges Elgozy Tôi tức giận khi nghĩ đến việc mình sẽ học được bao nhiêu nếu không đến trường. George Bernard Shaw Nhiều thứ được phát minh ra để không phải suy nghĩ. Karel Capek Nếu bạn nói sự thật thì sớm muộn gì bạn cũng sẽ bị bắt. Oscar Wilde Anh ta nên trở thành tổng thống nếu anh ta không bị treo cổ trước thời điểm đó. Mark Twain

Để xuất các phép biến đổi XSLT cho từng phần tử XML, hãy sử dụng thẻ XSL xsl:for-each. Phần tử :for-each định vị các phần tử trong tài liệu XML và lặp lại mẫu cho từng phần tử.

Dữ liệu có thể được sắp xếp bằng cách sử dụng thẻ xsl:sort, thẻ này phải nằm trong phần tử xsl:for-each:

Giao diện cuối cùng của tệp chuyển đổi:

Trích dẫn nổi tiếng

Trích dẫn Tác giả

Nếu bạn muốn xem kết quả của việc chuyển đổi tài liệu trong trình duyệt, hãy thêm phần khai báo sau phần khai báo XML

,

hoặc chọn Hiển thị đầu ra XML từ menu XML và chỉ định tệp chuyển đổi.

Tài liệu XML tương tự có thể được chuyển đổi bằng tệp XSL khác:

Bậc thầy của câu cách ngôn



Kết quả sẽ là các trích dẫn được phân cách bằng một đường ngang.

Tệp định nghĩa lược đồ tài liệu

Theo tiêu chuẩn hiện đại, một tài liệu hợp lệ phải khớp với tệp được liên kết với nó XSD(Định nghĩa lược đồ XML) - Tệp định nghĩa lược đồ XML xác định một ngôn ngữ cụ thể, nghĩa là mô tả những thành phần và loại nào có thể xuất hiện trong tài liệu. Các lược đồ XSD nhằm mục đích thay thế DTD (Định nghĩa loại tài liệu), điểm khác biệt giữa chúng là bản thân các tệp XSD cũng sử dụng cú pháp XML. Lược đồ XSD cho phép bạn xác định thẻ nào được phép, chúng có bắt buộc hay không, liệu chúng có thể được lặp lại trong tài liệu hay không, v.v. Do đó, XML mô tả dữ liệu và XSD mô tả cấu trúc của dữ liệu hoặc siêu dữ liệu đó. Trong thuật ngữ lập trình, XSD là mô tả về các loại, trong khi tệp XML mô tả các đối tượng thuộc loại đó. Bản dự thảo hoạt động của tiêu chuẩn XSD 1.1 có tại http://www.w3.org/TR/2003/WD-xmlschema-11-req-20030121/.

Tệp định nghĩa lược đồ bắt đầu bằng mô tả tiền tố vùng tên, sau đó được bao gồm trong tất cả các thành phần của tệp. http://tempuri.org được sử dụng để đặt URI cho không gian tên ASP.NET.

Ví dụ: định nghĩa này chỉ định rằng phần tử "Tác giả" có kiểu chuỗi, phải xuất hiện một lần và chỉ một lần và nếu không được chỉ định, sẽ nhận giá trị "Pushkin".

Tham số maxOccurs="unbounded" chỉ định rằng phần tử có thể xuất hiện bất kỳ số lần nào.

Tham số ref cho phép bạn tham chiếu đến nội dung nào đó đã được mô tả trong tập tin này một phần tử hoặc thuộc tính chung để tránh lặp lại các phần tử giống nhau.

  1. xác định loại đơn giản và phức tạp.

XSD có các loại được xác định trước - giống như .NET. Chúng được chuyển đổi thành loại .NET trong khi ứng dụng đang chạy. Dựa trên chúng, bạn có thể xây dựng các kiểu phức tạp tương tự như cấu trúc của ngôn ngữ lập trình. Một kiểu phức tạp bao gồm một chuỗi khai báo phần tử. Hãy xác định một loại phức tạp

Nhãn chỉ định rằng các phần tử trong một kiểu nhất định phải xuất hiện theo một thứ tự nhất định. Nếu thẻ đã được sử dụng , thì các phần tử có thể xuất hiện theo bất kỳ thứ tự nào.

Nhãn tương tự như một cấu trúc với các tùy chọn. Nó chỉ định rằng một phần tử của một kiểu nhất định chỉ được có một trong các phần tử lồng nhau của nó.

Ví dụ sau định nghĩa một kiểu đơn giản được lồng trong định nghĩa phần tử MyValue.

  1. Thêm nhóm mới và nhóm thuộc tính.

Một định nghĩa kiểu phức tạp có thể bao gồm các thuộc tính. Giả sử chúng ta muốn xây dựng một lược đồ cho một tệp như thế này:

Các thuộc tính chỉ có thể có kiểu đơn giản.

  1. Thêm chú thích.

Chú thích cho phép bạn chèn mô tả về các thành phần hiện có, từ đó thêm tài liệu vào tệp.

Trích dẫn từ nhiều tác giả khác nhau

dành cho người đọc tập tin, và cho các chương trình xử lý tập tin.

Bạn cũng có thể chỉnh sửa các tệp XSD trong Visual Studio 2005 thông qua nguồn, và với sự giúp đỡ của một nhà thiết kế. Đối với tài liệu XML, bạn có thể tự động tạo lược đồ tương ứng. Trong cửa sổ thuộc tính tài liệu XML, bạn có thể chỉ định cả tệp lược đồ và tệp biến đổi. Trong trường hợp này, studio tự động kiểm tra tệp xem có tuân thủ lược đồ hay không và thậm chí IntelliSense còn thay thế các thẻ từ tệp này.

Lớp XmlReader

Sử dụng lớp XmlReader, bạn có thể truy xuất dữ liệu từ tài liệu XML nhanh hơn các phương pháp khác.

XmlReader là một lớp trừu tượng. Để bắt đầu đọc, phương pháp tĩnh Tạo được truyền một đối tượng của lớp XmlReaderSettings. Hàm này đếm số lượng nút trong một tài liệu.

sử dụng System.Xml; sử dụng System.IO; int riêng CountNodes(string xmlFile) ( int NodesCount=0; XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; settings.IgnoreComments = true; sử dụng (XmlReader reader = XmlReader.Create(xmlFile, settings)) ( while ( reader.Read()) ( if (reader.NodeType == XmlNodeType.Element) ( NodesCount++; ) ) trả về NodesCount; )

Lớp XmlReader cho phép bạn truy xuất các lớp CLR từ một tài liệu. Hãy để chúng tôi có một thực đơn nhà hàng.

Hãy viết một hàm tính tổng giá và lượng calo trong thực đơn.

protected void Page_Load(object sender, EventArgs e) ( int ItemsCount = 0; thập phân DishesTotal = 0; UInt16 CaloriesTotal = 0; XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; NameTable nt = new NameTable(); thực phẩm đối tượng = nt.Add("thực phẩm"); giá đối tượng = nt.Add("giá"); calo đối tượng = nt.Add("calo"); settings.NameTable = nt; string MenuFile = Path.Combine(Request.PhysicalApplicationPath , "menu.xml"); sử dụng (XmlReader reader = XmlReader.Create(MenuFile, settings)) ( while (reader.Read()) ( if (reader.NodeType == XmlNodeType.Element && food.Equals(reader.LocalName )) ( ItemsCount++; ) if (reader.NodeType == XmlNodeType.Element && price.Equals(reader.LocalName)) ( DishesTotal += (UInt16)reader.ReadElementContentAsDecimal(); ) if (reader.NodeType == XmlNodeType.Element && calo.Equals(reader.LocalName)) ( CaloriesTotal += (UInt16)reader.ReadElementContentAsInt(); ) ) Response.Write(String.Format("Bạn đã đặt (0) món ăn trị giá (1:C), ( 2) calo", ItemCount, DishesTotal, CaloriesTotal)); )

Lớp XPathDocument

Lớp này cung cấp khả năng đọc và lưu trữ trong bộ nhớ các tài liệu XML để chuyển đổi bằng XSL. Bạn có thể điều hướng tài liệu theo bất kỳ hướng nào và có quyền truy cập ngẫu nhiên vào bất kỳ phần tử nào bằng cách sử dụng biểu thức XPath.

Hãy lấy tài liệu XML "Quotes.xml" và tệp chuyển đổi XSL "Quotes.xsl". Kết quả chuyển đổi tài liệu XML sẽ được gửi đến luồng đầu ra của trang.

<% XPathDocument doc = new XPathDocument(Server.MapPath("App_Data\\Quotes.xml")); XslCompiledTransform xsl = new XslCompiledTransform(); xsl.Load(Server.MapPath("App_Data\\Quotes.xsl")); xsl.Transform(doc, null, Response.OutputStream); %>

Do các thẻ bảng được xác định trong tệp chuyển đổi nên một bảng có thông tin cần thiết sẽ xuất hiện trên trang.

Kiểm soát XML

Điều khiển XML cung cấp cách chuyển đổi tài liệu XML bằng cách sử dụng biểu định kiểu XSL. Thuộc tính DocumentSource cho phép bạn chỉ định tệp XML chứa dữ liệu và thuộc tính TransformSource cho phép bạn chỉ định tệp chuyển đổi XSLT.

Trong ví dụ trước, có thể đạt được kết quả tương tự bằng cách đặt điều khiển XML trên trang.

Nguồn dữ liệu XML

Phần tử nguồn dữ liệu XML DataSource cung cấp một cách đơn giản để kết nối các tài liệu XML dưới dạng nguồn dữ liệu với các phần tử hiển thị thông tin. Bạn cũng có thể thiết lập Yêu cầu XPathđể lọc dữ liệu. Giống như SqlDataSource, nó cho phép bạn chỉnh sửa, xóa, thêm bản ghi dữ liệu. Để thực hiện việc này, bạn cần truy cập vào đối tượng XmlDataDocument nằm trong đó bằng cách gọi phương thức GetXmlDocument. Sau khi chỉnh sửa, tài liệu được lưu bằng phương pháp Lưu.

Không giống như dữ liệu dạng bảng trong DBMS, dữ liệu trong các tệp XML có tính phân cấp, do đó XMLDataSource rất thuận tiện để liên kết với các điều khiển có thứ bậc, chẳng hạn như Menu.

Cú pháp liên kết dữ liệu XML

Khi các ứng dụng sử dụng dữ liệu XML ngày càng thường xuyên hơn, một phương pháp đã được giới thiệu để liên kết dữ liệu thu được từ XMLDataSource.

Những phương thức này hoạt động theo cách tương tự như Bind và Eval, đã được thảo luận trong Bài giảng 7.

Hãy áp dụng cú pháp này cho phần tử DataList nhận dữ liệu từ XmlDataSource:

Phần kết luận

Trong bài giảng này chúng ta đã xem xét làm việc với dữ liệu loại XML. XML cung cấp phương pháp phổ quátđể mô tả và trao đổi thông tin có cấu trúc, độc lập với các ứng dụng và nhà phát triển. Điều này hoàn thành việc xem xét làm việc với các nguồn dữ liệu.

Mục tiêu của công việc:đạt được các kỹ năng thực tế trong việc xử lý dữ liệu được trình bày ở định dạng Ngôn ngữ đánh dấu mở rộng ( XML).

Mục tiêu công việc:

– nghiên cứu công nghệ mô tả dữ liệu XML;

- học lớp thư viện chính FCL, hỗ trợ xử lý dữ liệu được trình bày dưới dạng XM L;

– hoàn thành nhiệm vụ thực tế về phát triển ứng dụng bằng C#.

Thông tin lý thuyết tóm tắt

Định dạng XML là một cách lưu trữ dữ liệu ở định dạng văn bản đơn giản, có nghĩa là hầu hết mọi máy tính đều có thể đọc được dữ liệu. Hoàn cảnh này làm cho định dạng này rất phù hợp để sử dụng khi truyền dữ liệu qua Internet và thậm chí một người có thể đọc trực tiếp.

XML là ngôn ngữ đánh dấu có thể được sử dụng để mô tả dữ liệu tùy ý. Dựa trên ngôn ngữ này có thể tổ chức việc lưu trữ thông tin và trao đổi thông tin, độc lập với các ứng dụng cụ thể hoặc nền tảng mà chúng được thực thi trên đó.

XML- tài liệu. Tập dữ liệu hoàn chỉnh được biết đến trong XML là XML-tài liệu. XML-một tài liệu có thể là một tập tin vật lý trên máy tính của bạn, hoặc có thể chỉ là một dòng trong bộ nhớ, nhưng nó phải đầy đủ và tuân theo những quy tắc nhất định. XML-Tài liệu bao gồm nhiều phần khác nhau, trong đó quan trọng nhất là XML các phần tử chứa dữ liệu thực sự tạo nên tài liệu.

Microsoft. MẠNG LƯỚIKhung sử dụng mô hình dữ liệu đối tượng XMLĐối tượng tài liệu Người mẫu( DOM) để cung cấp quyền truy cập vào dữ liệu trong XML-tài liệu, và lớp học bổ sungđể đọc, viết và điều hướng trong XML-tài liệu. Các lớp này được hỗ trợ bởi không gian tên Hệ thống.XML. Một ví dụ về mô tả danh mục sách trong DOM được hiển thị trong Hình. 8.1.

Mô tả của một tài liệu XML bao gồm các câu lệnh được viết phù hợp với các yêu cầu về cú pháp của nó. Trong khi tạo XML-document thay vì sử dụng một bộ giới hạn một số yếu tố nhất định Có thể tạo các phần tử của riêng bạn và gán cho chúng bất kỳ tên nào mà người dùng chọn. Đó là lý do tại sao ngôn ngữ XML có thể mở rộng. Do đó, ngôn ngữ này có thể được sử dụng để mô tả hầu hết mọi tài liệu: từ bản nhạc đến cơ sở dữ liệu.

Mục lục

Cơm. 8.1. Cấu trúc tài liệu phân cấp

Ví dụ: một danh mục sách có thể được mô tả như trong Liệt kê 8.1 (số dòng không phải là một phần của tài liệu XML). Để tạo XML-tài liệu trong môi trường Thị giácPhòng thu . MẠNG LƯỚI bạn nên sử dụng lệnh Tài liệu\ MớiTài liệu và chọn tên mẫu trong danh sách mẫu thả xuống XMLTài liệu.

Liệt kê 8.1. Chữ XML-tài liệu

    C#2005 dành cho chuyên gia

    Christian Nagel

    1560

    800

    2006

    C# trong các tác vụ và ví dụ

    Nikita Kultin

    240

    350

    2007

Dòng 1 của danh sách này chứa thông báo XML, xác định văn bản là một tài liệu XML.Mặc dù thông báo có tính tùy chọn XML, tài liệu phải bao gồm nó để xác định phiên bản đang được sử dụng XML, vì tài liệu không có khai báo XML có thể được xem xét thêm khi thích hợp phiên bản mới nhất XML, có thể gây ra lỗi. Thông số thông tin phiên bản chỉ ra phiên bản XML, được sử dụng trong tài liệu, tham số mã hóa– mã hóa tài liệu ( utf-8).

Dòng 2 chứa nhận xét bắt đầu bằng các ký tự . Bình luận có thể được đăng trong suốt XML-tài liệu.

TRONG XML- dữ liệu tài liệu được đánh dấu bằng cách sử dụng thẻ(yếu tố), là những tên được đặt trong dấu ngoặc nhọn ( < > ). Gắn thẻ tên vào XML-tài liệu (chẳng hạn như MỤC LỤC, SÁCH,TIÊU ĐỀ,TÁC GIẢ,TRANG,GIÁ, PDATA trong Liệt kê 8.1) không phải là các định nghĩa ngôn ngữ XML và được gán khi tài liệu được tạo. Đối với thẻ, bạn có thể chọn bất kỳ tên nào được chỉ định chính xác, ví dụ: HÀNG TỒN KHO thay vì MỤC LỤC hoặc MỤC thay vì SÁCH. Dòng 3 chứa thẻ gốc - MỤC LỤC, mở phần đánh dấu của toàn bộ tài liệu. Khi viết xong thẻ gốc, khung công tác sẽ tự động chèn thẻ kết thúc (dòng 18 của Liệt kê 8.1), đánh dấu nó bằng các ký hiệu .

Ghi chú. Cố gắng tạo nhiều phần tử gốc trong XML-tài liệu là một lỗi.

Phần tử gốc có thể chứa một số lượng phần tử lồng nhau tùy ý. Trong Liệt kê 8.1 XML-tài liệu có cấu trúc phân cấp ở dạng cây với các phần tử được lồng trong các phần tử khác và có một phần tử cấp cao nhất Yếu tố tài liệu, hoặc Phần tử gốc(trong ví dụ của chúng tôi - MỤC LỤC), chứa tất cả các phần tử khác. Phần tử gốc MỤC LỤC bao gồm các phần tử con cháu SÁCH. Lần lượt, phần tử SÁCH bao gồm các yếu tố con cháu TIÊU ĐỀ, TÁC GIẢ,TRANG,GIÁ, PDATA.

Các tài liệu XML được định dạng tốt. Tài liệu đó được gọi là hình thành chính xác(được định dạng tốt) nếu nó đáp ứng bộ quy tắc tối thiểu sau đây cho XML-các tài liệu:

XML-tài liệu chỉ được có một phần tử gốc - phần tử Tài liệu. Tất cả các phần tử khác phải được lồng trong phần tử gốc;

– Các phần tử phải được lồng vào nhau một cách có trật tự. Nếu một phần tử bắt đầu bên trong phần tử khác thì nó phải kết thúc bên trong phần tử đó;

– Mỗi phần tử phải có thẻ bắt đầu và thẻ kết thúc. Không giống như HTML, XML không cho phép bỏ qua thẻ kết thúc ngay cả khi trình duyệt có thể xác định phần tử kết thúc ở đâu;

– tên thành phần trong thẻ bắt đầu phải khớp chính xác (phân biệt chữ hoa chữ thường) với tên trong thẻ kết thúc tương ứng;

– tên phần tử phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới ( _ ), theo sau là các chữ cái, số và ký hiệu: dấu chấm ( . ), dấu gạch ngang ( - ) hoặc gạch dưới.

Đây là những quy tắc cơ bản để hình thành chính xác XML-tài liệu. Các khái niệm khác của ngôn ngữ XML (thuộc tính, nguyên thủy, mối quan hệ) có các quy tắc riêng cần phải tuân theo. Chúng ta có thể nói rằng nếu một tài liệu được tạo chính xác và không xảy ra lỗi khi hiển thị hoặc sử dụng nó thì đây là tài liệu được định dạng chính xác. Nếu bạn mắc lỗi trong bất kỳ thẻ nào HTML-page, khi đó trình duyệt sẽ bỏ qua thẻ tương ứng và lỗi nằm ở thẻ XML-page sẽ khiến nó không thể hiển thị được. Nếu xuất hiện một trong các lỗi, trình phân tích được tích hợp trong Internet Explorer (đôi khi được gọi là XML-processor hoặc trình phân tích cú pháp) xác định vị trí của nó

Lớp thư viện FCL để đọc các tập tin XML. Làm việc với XML-tài liệu hỗ trợ các lớp thư viện sau FCL: Trình đọc văn bản Xml, Tài liệu Xml, XPathNavigator.

Lớp học Trình đọc văn bản Xml là một lớp trừu tượng thực hiện việc đọc và cung cấp khả năng phân phối nhanh dữ liệu không được lưu trong bộ nhớ đệm. Cách tiếp cận này ít tốn kém nhất về tài nguyên máy chủ nhưng nó buộc dữ liệu phải được truy xuất một cách tuần tự, từ đầu đến cuối.

Lớp học Tài liệu Xml thể hiện việc thực hiện mô hình DOM. Lớp này giữ dữ liệu trong bộ nhớ sau khi gọi một phương thức Trọng tải() để truy xuất chúng từ một tệp hoặc luồng, cung cấp chế độ xem dạng cây của tài liệu trong bộ nhớ với khả năng điều hướng và chỉnh sửa, đồng thời cho phép bạn sửa đổi dữ liệu và lưu lại vào tệp.

Lớp học XPathNavigator giống như lớp Tài liệu Xml, lưu giữ trong bộ nhớ XML- toàn bộ tài liệu. Nó cung cấp khả năng tìm kiếm dữ liệu nâng cao nhưng không cung cấp khả năng thực hiện thay đổi hoặc lưu chúng.

Lớp học Trình đọc văn bản Xml. Hãy xem xét một ví dụ đơn giản. Đặt các phần tử trên biểu mẫu richTextBoxcái nút(Hình 8.2). Khi bạn nhấp vào nút trên một phần tử richTextBox Tệp có nội dung được trình bày trong Liệt kê 8.1 sẽ được tải. Mã cho hàm được gọi khi nút được nhấp vào được hiển thị trong Liệt kê 8.2.

Cơm. 8.2. Đọc kết quả từ Xml-tài liệu

Liệt kê 8.2. Mã xử lý bấm nút

// Làm sạch phần tử richTextBox1

richTextBox1. Thông thoáng();

// Gọi một phương thức tĩnh Tạo nên() trả về một đối tượng lớp

// Tài liệu sách.xml nằm ở cùng vị trí với tệp thực thi

// chương trình

// Phương pháp Đọc() di chuyển đến nút tiếp theo Xml-tài liệu

trong khi (rdr.Read())

nếu như(rdr.NodeType ==XmlNodeType.Chữ)

richTextBox1.AppendText(rdr.Value + "\r\n");

Lớp học Trình đọc Xml cũng có thể đọc dữ liệu được gõ mạnh. Có một số phương pháp Đọc phần tửNội dung dưới dạng, thực hiện việc đọc, trong đó ReadElementContentAsDecimal(),Đọc phần tửNội dung dưới dạngInt() ,Đọc phần tửNội dung dưới dạngBoolean() và vân vân.

Liệt kê 8.3 cho thấy cách đọc các giá trị ở định dạng thập phân và thực hiện các phép toán trên chúng. Trong trường hợp này, giá của phần tử tăng 25%. Kết quả chạy mã này được hiển thị trong Hình. 8.3.

Cơm. 8.3. Đọc kết quả từ Xml - tài liệu

chỉ tên sách và giá sách

Liệt kê 8.3. Đọc dữ liệu với kiểm tra kiểu mạnh

// Làm sạch phần tử richTextBox1

richTextBox1. Thông thoáng();

// Tạo luồng để đọc từ file sách. xml

XmlReader rdr = XmlReader.Create("book.xml");

trong khi (rdr.Read())

if (rdr.NodeType == XmlNodeType.Element)

// Kiểm tra tên phần tử

nếu như (thứ. Tên == " GIÁ")

// Phương pháp Đọc phần tửNội dung dưới dạng thập phân() thực hiện

// chuyển đổi nội dung phần tử thành kiểu số thập phân

giá thập phân = rdr.ReadElementContentAsDecimal();

richTextBox1.AppendText("Hiện hànhgiá= " + giá +

"chà\r\ N");

// Giá thay đổi 25%

giá += giá * (thập phân).25;

richTextBox1.AppendText("Mớigiá= " + giá +

" chà xát\r\n\r\n");

khác nếu (rdr.Name == "TITLE")

richTextBox1.AppendText(rdr.ReadElementContentAsString() + "\r\n");

Lớp học Tài liệu Xml. Lớp này và lớp dẫn xuất của nó Tài liệu dữ liệu Xmlđược sử dụng trong thư viện .MẠNG LƯỚIđể thể hiện mô hình đối tượng tài liệu DOM.

Khác với lớp Trình đọc Xml, Lớp học Tài liệu Xml không chỉ cung cấp khả năng đọc mà còn cả khả năng viết cũng như truy cập ngẫu nhiên vào cây DOM.

Hãy xem một ví dụ trong đó một đối tượng của một lớp được tạo Tài liệu Xml, tài liệu được tải từ đĩa và một cửa sổ danh sách có tên sách được hiển thị (Hình 8.4).

Cơm. 8.4. Hiển thị tên sách trong một danh sách.

Trong lớp biểu mẫu ứng dụng, tạo một đối tượng lớp Tài liệu Xml:

XmlDocument_doc = XmlDocument mới();

Mã xử lý bấm nút được hiển thị trong Liệt kê 8.4.

_doc.Load("book.xml");

// Chỉ lấy những nút cần thiết

Danh sách XmlNodenútLst = _ bác sĩ. Nhận các phần tửByTagName(" TIÊU ĐỀ");

// Xem trong vòng lặp lớp Danh sách XmlNode

cho mỗi (Nút XmlnútTRONGnútLst)

danh sáchHộp1. Mặt hàng. Thêm vào(nút. Nội văn);

Hãy giới thiệu vào ứng dụng khả năng hiển thị thông tin về một cuốn sách có tựa đề được đánh dấu trong danh sách, chúng tôi sẽ thêm một trình xử lý sự kiện cho ứng dụng này danh sáchHộp1_ Đã chọn IndexĐã thay đổi như được hiển thị trong Liệt kê 8.5.

Liệt kê 8.5. Trình xử lý nhấp chuột vào mục danh sách

danh sách void riêng tưBox1_SelectedIndexChanged(người gửi đối tượng, EventArgs e)

// Tạo chuỗi tìm kiếm

chuỗi srch = "KATALOG/SÁCH";

// Tìm kiếm dữ liệu bổ sung

XmlNode FoundNode = _doc.SelectSingleNode(srch);

nếu (foundNode != null)

MessageBox.Show(foundNode.OuterXml);

MessageBox.Show("Không tìm thấy");

Kết quả của ứng dụng được thể hiện trong Hình. 8,5.

Cơm. 8,5. Hiển thị thông tin về mục danh sách đã chọn

Sử dụng một lớp Tài liệu Xml Bạn cũng có thể chèn các nút vào tài liệu hiện có bằng phương thức Tạo nên- Yếu tố() .

Ví dụ: để tạo một phần tử mới SÁCH bạn cần phải viết đoạn mã sau:

XmlElement newBook ​​​​= _doc.CreateElement("BOOK");

Tạo các phần tử lồng nhau trong một phần tử SÁCH, bạn có thể sử dụng đoạn mã sau:

// Tạo một phần tử mới TỰ ĐỘNG

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = "C.Baydachny";

Mã hoàn chỉnh của trình xử lý nhấp chuột vào nút được hiển thị trong Liệt kê 8.6, kết quả hoạt động của nó được hiển thị trong Hình. 8.6.

Liệt kê 8.6. Trình xử lý bấm nút

riêng tưtrống rỗngcái nút1_ Nhấp chuột(sự vậtngười gửi, Sự kiệnArgse)

_doc.Load("book.xml");

XmlElement newBook ​​​​= _doc.CreateElement("BOOK");

// Tạo một phần tử mới TIÊU ĐỀ

XmlElement newTitle = _doc.CreateElement("TITLE");

newTitle.InnerText = ".NET Framework 2.0";

newBook.AppendChild(newTitle);

// Tạo một phần tử mới TỰ ĐỘNG

XmlElement newAuthor = _doc.CreateElement("AUTOR");

newAuthor.InnerText = "C.Baydachny";

newBook.AppendChild(newAuthor);

// Tạo một phần tử mới TRANG

Trang mới XmlElement = _doc.CreateElement("PAGES");

newpages.InnerText = "498";

newBook.AppendChild(trang mới);

// Tạo một phần tử mới GIÁ

XmlElement newprice = _doc.CreateElement("PRICE");

newprice.InnerText = "590";

newBook.AppendChild(newprice);

// Tạo một phần tử mới PDATA

XmlElement newpdata = _doc.CreateElement("PDATA");

newpdata.InnerText = "2006";

newBook.AppendChild(newpdata);

// Thêm vào tài liệu hiện tại

_doc.DocumentElement.AppendChild(newBook);

// Ghi tài liệu vào đĩa

XmlTextWriter tr = new XmlTextWriter("bookEdit.xml", null);

tr.Formatting = Định dạng.Indented;

_doc.WriteContentTo(tr);

tr. Đóng();

Danh sách XmlNodenútLst = _ bác sĩ. Nhận các phần tửByTagName(" TIÊU ĐỀ");

// Xem trong vòng lặp lớp Danh sách XmlNode

cho mỗi (Nút XmlnútTRONGnútLst)

danh sáchHộp1. Mặt hàng. Thêm vào(nút. Nội văn);

Khi sử dụng lớp Tài liệu XmlTrình đọc Xml Các tính năng sau đây phải được tính đến. Nếu bạn cần truy cập ngẫu nhiên vào một tài liệu, bạn nên sử dụng lớp Tài liệu Xml và nếu bạn cần một mô hình phân luồng thì các lớp dựa trên lớp Trình đọc Xml. Lớp học Tài liệu Xml rất linh hoạt, nhưng yêu cầu bộ nhớ của nó cao hơn so với lớp Trình đọc Xml và hiệu suất khi đọc tài liệu thấp hơn.

Cơm. 8.6. Cửa sổ ứng dụng đang chạy

có thêm nút

Lớp học XPathNavigator. Lớp học XPathNavigator là một phần của không gian tên Hệ thống. Xml. XPath, được thiết kế để tăng hiệu suất. Không gian này chỉ cung cấp khả năng đọc tài liệu, do đó không có công cụ chỉnh sửa nào trong đó và các lớp được xây dựng để đảm bảo thực thi nhanh chóng trên một môi trường nhất định. XML-vòng lặp tài liệu và thao tác lựa chọn theo kiểu con trỏ.

Cách tốt nhất để sử dụng các lớp từ một không gian tên Hệ thống. Xml. XPathđang xem tài liệu sách. xml trong một chu kỳ.

Đặt các phần tử trên biểu mẫu danh sáchHộpcái nút. Mã xử lý nhấp chuột vào nút được hiển thị trong Liệt kê 8.7, kết quả thực thi mã này được hiển thị trong Hình. 8.7.

Liệt kê 8.7. Trình xử lý bấm nút

riêng tưtrống rỗngcái nút1_ Nhấp chuột(sự vậtngười gửi, Sự kiệnArgse)

// Tạo một đối tượng có tên bác sĩ lớp học Tài liệu XPath và chuyển giao

// trong hàm tạo tên của nó XML- tài liệu sách.xml

Tài liệu XPathDocument = XPathDocument mới("book.xml");

// Tạo một đối tượng có tên điều hướng lớp học XPathNavigator dựa trên đối tượng

// XPathDocument. Một đối tượng điều hướng có thể được sử dụng ở chế độ chỉ đọc

Điều hướng XPathNavigator = ((IXPathNavigable)doc). CreateNavigator();

// Tạo một đối tượng XPathNodeIterator cho các nút thư mục

// và các nút con của nó

XPathNodeIterator iter = nav.Select("/KATALOG/BOOK");

trong khi (iter.MoveNext())

// Phương pháp ChọnHậu duệ() lớp học XPathNavigator chọn mọi thứ

// các nút con của nút hiện tại đáp ứng các điều kiện lựa chọn

XPathNodeIterator newIter =