1. Trang chủ
  2. » Công Nghệ Thông Tin

Các giải pháp lập trình CSharp- P18 pot

10 257 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 2,62 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ, bạn có thể muốn duyệt một nhánh cụ thể của một tài liệu XML để tìm các nút có các đặc tính nào đó hoặc chứa một số lượng nút con lồng bên trong.. Ví dụ dưới đây sử dụng một đường

Trang 1

<cli:lastName>Sergeyeva</cli:lastName>

</cli:client>

<ord:orderItem itemNumber="3211"/>

<ord:orderItem itemNumber="1155"/>

</ord:order>

Và chương trình dưới đây sẽ chọn tất cả các thẻ trong không gian tên http://mycompany/OrderML:

using System;

using System.Xml;

public class SelectNodesByNamespace {

private static void Main() {

// Nạp tài liệu

XmlDocument doc = new XmlDocument();

doc.Load("Order.xml");

// Thu lấy tất cả các thẻ đặt hàng

XmlNodeList matches = doc.GetElementsByTagName("*",

"http://mycompany/OrderML");

// Hiển thị thông tin

Console.WriteLine("Element \tAttributes");

Console.WriteLine("******* \t**********");

foreach (XmlNode node in matches) {

Console.Write(node.Name + "\t");

foreach (XmlAttribute attribute in node.Attributes) {

Console.Write(attribute.Value + " ");

}

Console.WriteLine();

}

Trang 2

Console.ReadLine();

}

}

Kết xuất của chương trình này như sau:

Element Attributes

******* **********

ord:order http://mycompany/OrderML http://mycompany/ClientML

ord:orderItem 3211

ord:orderItem 1155

6. Tìm các ph n t v i bi u th c XPath Tìm các ph n t v i bi u th c XPath ầ ử ớ ể ầ ử ớ ể ứ ứ

Bạn cần duyệt một tài liệu XML để tìm các nút theo một tiêu chuẩn tìm kiếm cấp

cao Ví dụ, bạn có thể muốn duyệt một nhánh cụ thể của một tài liệu XML để tìm

các nút có các đặc tính nào đó hoặc chứa một số lượng nút con lồng bên trong.

Thực thi một biểu thức XPath bằng phương thức SelectNodes hay

SelectSingleNode của lớp XmlDocument.

Lớp XmlNode định nghĩa hai phương thức dùng để tìm kiếm dựa vào biểu thức Xpath là SelectNodes và SelectSingleNode Hai phương thức này thao tác trên tất cả các nút con Vì XmlDocument thừa kế từ XmlNode nên bạn có thể gọi XmlDocument.SelectNodes để dò tìm toàn

bộ một tài liệu.

Xét tài liệu XML mô tả một đơn đặt hàng gồm hai item:

<?xml version="1.0"?>

<Order id="2004-01-30.195496">

<Client id="ROS-930252034">

<Name>Remarkable Office Supplies</Name>

</Client>

<Items>

<Item id="1001">

<Name>Electronic Protractor</Name>

<Price>42.99</Price>

</Item>

<Item id="1002">

<Name>Invisible Ink</Name>

Trang 3

</Item>

</Items>

</Order>

Cú pháp của XPath sử dụng ký hiệu giống như đường dẫn Ví dụ, đường dẫn

/Order/Items/Item cho biết phần tử <Item> lồng bên trong phần tử <Items>, và phần tử

<Items> lồng bên trong phần tử gốc <Order> Ví dụ dưới đây sử dụng một đường dẫn tuyệt đối

để tìm tên của tất cả các item trong một đơn đặt hàng:

using System;

using System.Xml;

public class XPathSelectNodes {

private static void Main() {

// Nạp tài liệu

XmlDocument doc = new XmlDocument();

doc.Load("orders.xml");

// Thu lấy tên của tất cả các item

// Việc này không thể hoàn tất dễ dàng với phương thức

// GetElementsByTagName(), vì các phần tử Name được sử dụng

// bên trong các phần tử Item và các phần tử Client, và do đó

// cả hai kiểu này đều sẽ được trả về

XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name");

foreach (XmlNode node in nodes) {

Console.WriteLine(node.InnerText);

}

Console.ReadLine();

}

}

Kết xuất của chương trỉnh này như sau:

Electronic Protractor

Invisible Ink

XPath cung cấp một cú pháp tìm kiếm mạnh Do không thể giải thích tất cả các biến thể của

nó chỉ trong một mục ngắn như thế này, nên bảng 5.1 chỉ trình bày các phần chính trong một

Trang 4

biểu thức XPath và các ví dụ mô tả cách làm việc của chúng với tài liệu XML ở trên Để hiểu chi tiết hơn, bạn hãy tham khảo tài liệu W3C XPath tại [http://www.w3.org/TR/xpath].

Bảng 5.1 Cú pháp của biểu thức XPath

/

Bắt đầu một đường dẫn tuyệt đối (chọn từ nút gốc).

/Order/Items/Item chọn tất cả các phần tử Item là con của một phần tử Items, mà bản thân Items là con của phần tử gốc Order

//

Bắt đầu một đường dẫn tương đối (chọn nút bất cứ đâu).

//Item/Name chọn tất cả các phần tử Name là con của một phần tử Item, bất chấp chúng xuất hiện ở đâu trong tài liệu.

@ Chọn một đặc tính của một nút.

/Order/@id chọn đặc tính có tên là id từ phần tử gốc Order

*

Chọn bất cứ phần tử nào trong đường dẫn.

/Order/* chọn nút Items và Client vì cả hai đều nằm trong phần tử gốc Order

|

Kết hợp nhiều đường dẫn.

/Order/Items/Item/Name|Order/Client/Name chọn các nút Name dùng để

mô tả một Client và các nút Name dùng để mô tả một Item.

Cho biết nút (mặc định) hiện hành.

Nếu nút hiện hành là một Order, biểu thức /Items chỉ đến các item liên quan với đơn đặt hàng đó.

Cho biết nút cha.

//Name/ chọn phần tử là cha của một Name, gồm các phần tử Client và Item

[ ]

Định nghĩa tiêu chuẩn chọn lựa (selection criteria), có thể kiểm tra giá trị

của một nút bên trong hay của một đặc tính.

/Order[@id="2004-01-30.195496"] chọn các phần tử Order với giá trị đặc tính cho trước.

/Order/Items/Item[Price > 50] chọn các sản phẩm có giá trên $50

/Order/Items/Item[Price > 50 and Name="Laser Printer"] chọn các sản phẩm trùng khớp với cả hai tiêu chuẩn.

starts-with

Hàm này thu lấy các phần tử dựa vào phần text khởi đầu của phần tử nằm bên trong.

/Order/Items/Item[starts-with(Name,"C")] tìm tất cả các phần tử Item

có phần tử Name bắt đầu bằng mẫu tự C.

Trang 5

position Hàm này thu lấy các phần tử dựa vào vị trí.

/Order/Items/Item[position()=2] chọn phần tử Item thứ hai

count

Hàm này đếm số phần tử Bạn cần chỉ định tên của phần tử con cần đếm hoặc dấu hoa thị (*) cho tất cả các phần tử con.

/Order/Items/Item[count(Price)=1] thu lấy các phần tử Item có đúng một phần tử Price lồng bên trong.

Biểu thức XPath và tất cả tên phần tử và đặc tính mà bạn sử dụng trong đó luôn

có phân biệt chữ hoa-thường, vì bản thân XML có phân biệt chữ hoa-thường.

7. Đ c và ghi XML mà không ph i n p toàn b tài li u vào b nh Đ c và ghi XML mà không ph i n p toàn b tài li u vào b nh ọ ọ ả ạ ả ạ ộ ộ ệ ệ ộ ớ ộ ớ

Bạn cần đọc XML từ một stream, hoặc ghi nó ra một stream Tuy nhiên, bạn

muốn xử lý từng nút một, không phải nạp toàn bộ vào bộ nhớ với một

XmlDocument.

Để ghi XML, hãy tạo một XmlTextWriter bọc lấy một stream và sử dụng các

phương thức Write (như WriteStartElementWriteEndElement) Để đọc XML,

hãy tạo một XmlTextReader bọc lấy một stream và gọi phương thức Read để dịch chuyển từ nút này sang nút khác

Lớp XmlTextWriter và XmlTextReader đọc/ghi XML trực tiếp từ stream từng nút một Các lớp

này không cung cấp các tính năng dùng để duyệt và thao tác tài liệu XML như XmlDocument,

nhưng hiệu năng cao hơn và vết bộ nhớ nhỏ hơn, đặc biệt khi bạn làm việc với các tài liệu

XML cực kỳ lớn.

Để ghi XML ra bất kỳ stream nào, bạn có thể sử dụng XmlTextWriter Lớp này cung cấp các

phương thức Write dùng để ghi từng nút một, bao gồm:

• WriteStartDocument—ghi phần khởi đầu của tài liệu; và WriteEndDocument, đóng bất

kỳ phần tử nào đang mở ở cuối tài liệu.

• WriteStartElement—ghi một thẻ mở (opening tag) cho phần tử bạn chỉ định Kế đó, bạn có thể thêm nhiều phần tử lồng bên trong phần tử này, hoặc bạn có thể gọi WriteEndElement để ghi thẻ đóng (closing tag)

• WriteElementString—ghi một phần tử, cùng với một thẻ mở, một thẻ đóng, và nội dung text.

• WriteAttributeString—ghi một đặc tính cho phần tử đang mở gần nhất, cùng với tên

và giá trị.

Sử dụng các phương thức này thường cần ít mã lệnh hơn là tạo một XmlDocument bằng tay, như được trình bày trong mục 5.2 và 5.3.

Để đọc XML, bạn sử dụng phương thức Read của XmlTextReader Phương thức này tiến reader

đến nút kế tiếp, và trả về true Nếu không còn nút nào nữa, nó sẽ trả về false Bạn có thể thu lấy thông tin về nút hiện tại thông qua các thuộc tính của XmlTextReader (bao gồm Name, Value, và NodeType)

Trang 6

Để nhận biết một phần tử có các đặc tính hay không, bạn phải kiểm tra thuộc tính HasAttributes và rồi sử dụng phương thức GetAttribute để thu lấy các đặc tính theo tên hay theo chỉ số Lớp XmlTextReader chỉ có thể truy xuất một nút tại một thời điểm, và nó không thể dịch chuyển ngược hay nhảy sang một nút bất kỳ Do đó, tính linh hoạt của nó kém hơn lớp XmlDocument

Ứng dụng dưới đây ghi và đọc một tài liệu XML bằng lớp XmlTextWriter và XmlTextReader

Tài liệu này giống với tài liệu đã được tạo trong mục 5.2 và 5.3 bằng lớp XmlDocument.

using System;

using System.Xml;

using System.IO;

using System.Text;

public class ReadWriteXml {

private static void Main() {

// Tạo file và writer

FileStream fs = new FileStream("products.xml", FileMode.Create);

XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);

// Khởi động tài liệu

w.WriteStartDocument();

w.WriteStartElement("products");

// Ghi một product

w.WriteStartElement("product");

w.WriteAttributeString("id", "1001");

w.WriteElementString("productName", "Gourmet Coffee");

w.WriteElementString("productPrice", "0.99");

w.WriteEndElement();

// Ghi một product khác

w.WriteStartElement("product");

w.WriteAttributeString("id", "1002");

w.WriteElementString("productName", "Blue China Tea Pot");

w.WriteElementString("productPrice", "102.99");

Trang 7

// Kết thúc tài liệu.

w.WriteEndElement();

w.WriteEndDocument();

w.Flush();

fs.Close();

Console.WriteLine("Document created " +

"Press Enter to read the document.");

Console.ReadLine();

fs = new FileStream("products.xml", FileMode.Open);

XmlTextReader r = new XmlTextReader(fs);

// Đọc tất cả các nút

while (r.Read()) {

if (r.NodeType == XmlNodeType.Element) {

Console.WriteLine();

Console.WriteLine("<" + r.Name + ">");

if (r.HasAttributes) {

for (int i = 0; i < r.AttributeCount; i++) {

Console.WriteLine("\tATTRIBUTE: " +

r.GetAttribute(i));

}

}

}

else if (r.NodeType == XmlNodeType.Text) {

Console.WriteLine("\tVALUE: " + r.Value);

}

}

Console.ReadLine();

}

Trang 8

8. Xác nh n tính h p l c a m t tài li u XML d a trên m t Xác nh n tính h p l c a m t tài li u XML d a trên m t ậ ậ ợ ệ ủ ộ ợ ệ ủ ộ ệ ệ ự ự ộ ộ

Schema

Bạn cần xác nhận tính hợp lệ của một tài liệu XML bằng cách bảo đảm nó tuân

theo một XML Schema.

Sử dụng lớp System.Xml.XmlValidatingReader Tạo một thể hiện của lớp này, nạp

Schema vào tập hợp XmlValidatingReader.Schemas, dịch chuyển qua từng nút một bằng cách gọi XmlValidatingReader.Read, và bắt bất cứ ngoại lệ nào Để tìm tất cả các lỗi trong một tài liệu mà không phải bắt ngoại lệ, hãy thụ lý sự kiện

ValidationEventHandler.

Một XML Schema (giản đồ XML) định nghĩa các quy tắc mà một kiểu tài liệu XML cho trước

phải tuân theo Các quy tắc này định nghĩa:

• Các phần tử và đặc tính có thể xuất hiện trong tài liệu.

• Các kiểu dữ liệu cho phần tử và đặc tính.

• Cấu trúc của tài liệu, bao gồm các phần tử nào là con của các phần tử khác.

• Thứ tự và số lượng các phần tử con xuất hiện trong tài liệu.

• Các phần tử nào là rỗng, có thể chứa text, hay đòi hỏi các giá trị cố định.

Bàn sâu về các tài liệu XML Schema vượt quá phạm vi của chương này, nhưng bạn có thể tìm hiểu nó thông qua một ví dụ đơn giản Mục này sẽ sử dụng tài liệu XML mô tả danh mục sản

phẩm đã được trình bày trong mục 5.1.

Ở mức cơ bản nhất, XML Schema Definition (XSD) được sử dụng để định nghĩa các phần tử

có thể xuất hiện trong tài liệu XML Bản thân tài liệu XSD được viết theo dạng XML, và bạn sử

dụng một phần tử đã được định nghĩa trước (có tên là <element>) để chỉ định các phần tử sẽ cần thiết trong tài liệu đích Đặc tính type cho biết kiểu dữ liệu Ví dụ dưới đây là tên sản phẩm:

<xsd:element name="productName" type="xsd:string" />

Và ví dụ dưới đây là giá sản phẩm:

<xsd:element name="productPrice" type="xsd:decimal" />

Bạn có thể tìm hiểu các kiểu dữ liệu Schema tại [http://www.w3.org/TR/xmlschema-2] Chúng ánh xạ đến các kiểu dữ liệu NET và bao gồm string, int, long, decimal, float, dateTime,

boolean, base64Binary

Cả productName và productPrice đều là các kiểu đơn giản vì chúng chỉ chứa dữ liệu dạng ký

tự Các phần tử có chứa các phần tử lồng bên trong được gọi là các kiểu phức tạp Bạn có thể lồng chúng vào nhau bằng thẻ <sequence> (nếu thứ tự là quan trọng) hay thẻ <all> (nếu thứ tự

là không quan trọng) Dưới đây là cách lắp phần tử <product> vào danh mục sản phẩm Chú ý

Trang 9

<sequence> hay <all> vì thứ tự không quan trọng.

<xsd:complexType name="product">

<xsd:sequence>

<xsd:element name="productName" type="xsd:string"/>

<xsd:element name="productPrice" type="xsd:decimal"/>

<xsd:element name="inStock" type="xsd:boolean"/>

</xsd:sequence>

<xsd:attribute name="id" type="xsd:integer"/>

</xsd:complexType>

Theo mặc định, một phần tử có thể xuất hiện đúng một lần trong một tài liệu Nhưng bạn có thể cấu hình điều này bằng cách chỉ định các đặc tính maxOccurs và minOccurs Ví dụ dưới đây không giới hạn số lượng sản phẩm trong danh mục:

<xsd:element name="product" type="product" maxOccurs="unbounded" />

Dưới đây là Schema cho danh mục sản phẩm:

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<! Định nghĩa product (kiểu phức) >

<xsd:complexType name="product">

<xsd:sequence>

<xsd:element name="productName" type="xsd:string"/>

<xsd:element name="productPrice" type="xsd:decimal"/>

<xsd:element name="inStock" type="xsd:boolean"/>

</xsd:sequence>

<xsd:attribute name="id" type="xsd:integer"/>

</xsd:complexType>

<! Đây là cấu trúc mà tài liệu phải tuân theo

Bắt đầu với phần tử productCatalog >

<xsd:element name="productCatalog">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="catalogName" type="xsd:string"/>

<xsd:element name="expiryDate" type="xsd:date"/>

<xsd:element name="products">

Trang 10

<xsd:complexType>

<xsd:sequence>

<xsd:element name="product" type="product"

maxOccurs="unbounded" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

Lớp XmlValidatingReader thực thi tất cả các quy tắc Schema này—bảo đảm tài liệu là hợp lệ

—và nó cũng kiểm tra tài liệu XML đã được chỉnh dạng hay chưa (nghĩa là không có các ký tự

bất hợp lệ, tất cả các thẻ mở đều có một thẻ đóng tương ứng, v.v ) Để kiểm tra một tài liệu, hãy dùng phương thức XmlValidatingReader.Read để duyệt qua từng nút một Nếu tìm thấy lỗi, XmlValidatingReader dựng lên sự kiện ValidationEventHandler với các thông tin về lỗi Nếu muốn, bạn có thể thụ lý sự kiện này và tiếp tục kiểm tra tài liệu để tìm thêm lỗi Nếu bạn không thụ lý sự kiện này, ngoại lệ XmlException sẽ được dựng lên khi bắt gặp lỗi đầu tiên và quá trình kiểm tra sẽ bị bỏ dở Để kiểm tra một tài liệu đã được chỉnh dạng hay chưa, bạn có thể sử dụng XmlValidatingReader mà không cần đến Schema.

Ví dụ kế tiếp trình bày một lớp tiện ích dùng để hiển thị tất cả các lỗi trong một tài liệu XML

khi phương thức ValidateXml được gọi Các lỗi sẽ được hiển thị trong một cửa sổ Console, và một biến luận lý được trả về để cho biết quá trình kiểm tra thành công hay thất bại

using System;

using System.Xml;

using System.Xml.Schema;

public class ConsoleValidator {

// Thiết lập thành true nếu tồn tại ít nhất một lỗi

private bool failed;

public bool Failed {

get {return failed;}

}

Ngày đăng: 08/07/2014, 17:20

HÌNH ẢNH LIÊN QUAN

Bảng 5.1 Cú pháp của biểu thức XPath - Các giải pháp lập trình CSharp- P18 pot
Bảng 5.1 Cú pháp của biểu thức XPath (Trang 4)

TỪ KHÓA LIÊN QUAN