Tải bản đầy đủ (.pdf) (14 trang)

Thao tác XML - Đọc và ghi Streamed XML – Phần 2 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (117.59 KB, 14 trang )

Thao tác XML
Đọc và ghi Streamed XML – Phần 2

Sử dụng lớp XmlValidatingReader
Nếu bạn muốn xác nhận một tài liệu XML, bạn sẽ cần phải sử dụng lớp
XmlValidatingReader. Nó chứac các khả năng giống như XmlTextReader
(Cả hai đều xuất phát từ XmlReader) nhưng XmlValidatingReader có thêm
thuộc tính ValidationType, thuộc tính Schemas và SchemaType.
Nếu bạn gán thuộc tính ValidationType giá trị xác nhận mà bạn muốn. Giá
trị hợp lệ của thuộc tính này được liệt kê trong bảng sau:
Property
Value
Description
Auto Nếu một DTD đư
ợc khai báo trong một khai báo
<!DOCTYPE >, điều này cho phép DTD sẽ được load

Property
Value
Description
xử lí. Giá trị mặc định cho các DTD.
Nếu một thuộc tính XSD schemalocation được tìm th
ấy,
XSD được load và xử lí, và s
ẽ trả về các giá trị mặc định
trong sơ đồ.
Nếu một không gian tên với tiếp đầu ngữ MSXML x-
schema
được tìm thấy, nó sẽ load và xử lí sơ đồ XDR và tr
ả về các
thuộc tính mặc định đã được định nghĩa.


DTD Phù hợp theo chuẩn DTD.
Schema Phù hợp theo sơ đồ XSD.
XDR Phù hợp theo sơ đồ XDR.
None Không giá trị hợp lệ nào được thực thi.
Khi một thuộc tính trong này được chọn, Một ValidationEventHandler cần
phải được gán. Đây là một sự kiện được tạo ra do các lỗi. Bạn có thể tác
động lại lỗi theo các mà bạn cho là phù hợp.
Hãy xem cách làm việc của ví dụ sau. Trướct tiên chúng ta sẽ thêm một sơ
đồ không gian tên XDR (XM- Data Reduced) vào file books.xml của chúng
ta, và đổi tên file này thành booksVal.xml. Nó trông như thế này:
<?xml version='1.0'?>
<! This file represents a fragment of a book store inventory database >
<bookstore xmlns="x-schema:books.xdr">
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-
11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<list-name>Franklin</list-name>
</author>
<price>8.99</price>
</book>

</bookstore>
Chú ý rằng bookstore bây giờ có thuộc tính xmlns="x-schema:books.xdr".
Nó sẽ ánh xạ đến sơ đồ XDR sau, gọi books.xdr:
<?xml version="1.0"?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="first-name" content="textOnly"/>

<ElementType name="last-name" content="textOnly"/>
<ElementType name="name" content="textOnly"/>
<ElementType name="price" content="textOnly" dt:type="fixed.14.4"/>
<ElementType name="author" content="eltOnly" order="one">
<group order="seq">
<element type="name"/>
</group>
<group order="seq">
<element type="first-name"/>
<element type="last-name"/>
</group>
</ElementType>
<ElementType name="title" content="textOnly"/>
<AttributeType name="genre" dt:type="string"/>
<ElementType name="book" content="eltOnly">
<attribute type="genre" required="yes"/>
<element type="title"/>
<element type="author"/>
<element type="price"/>
</ElementType>
<ElementType name="bookstore" content="eltOnly">
<element type="book"/>
</ElementType>
</Schema>
Giờ đây mọi thứ trông khá rõ ràng chúng ta có một file XML với hai thuộc
tính được định nghĩa trong sơ đồ (publicationdate và ISBN từ các thành
phần của sách). Chúng ta sẽ thêm chúng vào để bẫy các lỗi phát ra. Mã
nguồn nằm trong thư mục XmlReaderSample5.
First, you will also need to add:
using System.Xml.Schema;

to your class. Then add the following to the button event handler:
protected void button1_Click (object sender, System.EventArgs e)
{
//change this to match your path structure.
string fileName = " \\ \\ \\booksVal.xml";
XmlTextReader tr=new XmlTextReader(fileName);
XmlValidatingReader trv = new XmlValidatingReader(tr);
//Set validation type
trv.ValidationType=ValidationType.XDR;
//Add in the Validation eventhandler
trv.ValidationEventHandler +=
new ValidationEventHandler(this.ValidationEvent);
//Read in node at a time
while(trv.Read())
{
if(trv.NodeType == XmlNodeType.Text)
listBox1.Items.Add(trv.Value);
}
}
public void ValidationEvent (object sender, ValidationEventArgs args)
{
MessageBox.Show(args.Message);
}
Ở đây chúng tôi tạo một XmlTextReader truyền cho XmlValidatingReader.
Trước tiên XmlValidatingReader được tạo, chúng ta có thể dùng nó giống
như cách đã làm với XmlTextReader trong ví dụ trước. Chỉ khác là chúng ta
chỉ rõ ValidationType, và thêm vào một ValidationEventHandler. Bạn có thể
bẫy lỗi theo cách mà bạn cho là hợp lí trong ví dụ này chung tôi đưa ra một
thông báo lỗi. Thông báo trông như thế này khi có ngoại lệ ValidationEvent
xảy ra:


Không giống như một vài thành viên khác, ngưng khi có ngoại lệ xảy ra,
XmlValidatingReader sẽ giữ nó trong quá trình đọc. Nhiệm vụ của bạn là
ngưng đọc và xử lí lỗi nếu bạn cho rằng đây là một lỗi quan trọng.
Sử dụng Schemas Property
Schemas property của XmlValidatingReader chứa một
XmlSchemaCollection, có thể tìm thấy trong không gian tên
System.Xml.Schema. Tập hợp này tổ chức load lại loaded XSD và XDR
schemas. Nó cực nhanh đặc biệc là khi bạn cần kiểm tra sự hợp lệ của nhiều
tài liệu khác nhau, vì sơ đồ sẽ không được load mỗi khi kiểm tra. Các bước
sử dụng thuộc tính này như sau, bạn tạo một đối tượng
XmlSchemaCollection. Phương thức Add(), nằm trong một
XmlSchemaCollection, có bốn quá tải. Bạn có thể truyền nó cho một đối
tượng xuất phát từ XmlSchema, một đối tượng xuất phát từ
XmlSchemaCollection, một chuỗi không gian tên với chuỗi URI của file sơ
đồ và một đối tượng xuất phát từ XmlReader chứa trong sơ đồ.
Sử dụng lớp XmlTextWriter
Lớp XmlTextWriter cho phép bạn xuất XML thành một chuỗi, một file hoặc
một đối tượng a TextWriter. Giống như XmlTextReader, nó là một kiểu
forward-only, non-cached. XmlTextWriter có thể cấu hình cao, cho phép
bạn chỉ rõ những thứ như cho phép thục đầu dòng, số thục đầu dòng, kí tự
chỉ dẫn nào được dùng trong các giá trị thuộc tính cho phép không gian tên
được hỗ trợ.
Hãy xem ví dụ sau, để biết cách sử dụng lớp XmlTextWriter. Có thể tìm
thấy mã nguồn trong thư mục XmlWriterSample1:
private void button1_Click(object sender, System.EventArgs e)
{
// change to match your path structure
string fileName=" \\ \\ \\booknew.xml";
// create the XmlTextWriter

XmlTextWriter tw=new XmlTextWriter(fileName,null);
// set the formatting to indented
tw.Formatting=Formatting.Indented;
tw.WriteStartDocument();
// Start creating elements and attributes
tw.WriteStartElement("book");
tw.WriteAttributeString("genre","Mystery");
tw.WriteAttributeString("publicationdate","2001");
tw.WriteAttributeString("ISBN","123456789");
tw.WriteElementString("title","The Case of the Missing Cookie");
tw.WriteStartElement("author");
tw.WriteElementString("name","Cookie Monster");
tw.WriteEndElement();
tw.WriteElementString("price","9.99");
tw.WriteEndElement();
tw.WriteEndDocument();
//clean up
tw.Flush();
tw.Close();
}
Ở đây chúng tôi viết một file XML mới gọi là booknew.xml, và thêm dữ liệu
cho một sách mới. Nhớ rằng XmlTextWriter này sẽ ghi đè file mới lên file
cũ. Chúng ta sẽ xem xét một thành các thành phần, các nút mới trong một tài
liệu trong phần sau của chương. Chúng tôi giải thích đối tượng
XmlTextWriter dùng một đối tượng FileStream như là một tham số. Chúng
ta cũng có thể truyền một chuỗi tên file và đường dẫn, hoặc một đối tượng
xuất phát từ TextWriter. Tiếp theo chúng tôi cài đặt thuộc tính Indenting.
Trước tiên các mục con được tự động sao chép từ lơp cha.
WriteStartDocument() sẽ thêm khai báo tài liệu. Bây giờ chúng ta bắt đầu
viết dữ liệu. Trước tiên là các thành phần của sách, sau đó thêm loại, ngày

sản xuất, và các thuộc tính ISBN. Thêm các thành phần tựa sách, tác giả,
giá. Nhớ rằng thành phần tác giả có một tên thành phần con.
Khi nhấn nút chúng ta sẽ nhận được file booknew.xml như sau:
<?xml version="1.0"?>
<book genre="Mystery" publicationdate="2001" ISBN="123456789">
<title>The Case of the Missing Cookie</title>
<author>
<name>Cookie Monster</name>
</author>
<price>9.99</price>
</book>
Các thành phần được điều khiển bằng việc theo dõi khi nào bạn bắt đầu và
kết thúc thao tác viết các thành phần các thuộc tính. Bạn có thể bắt gặp
chúng khi chúng ta thêm vào tên của thành phần con cho các thành phần tác
giả. Chú ý việc các lời gọi phương thức WriteStartElement() và
WriteEndElement() được tổ chức như thế nào và các tổ chức các sản phẩm
các bộ thành phần trong file xuất.
Các phương thức WriteElementString() và WriteAttributeString(), có một
vài phương thức ghi đặc biệc. WriteCData() sẽ xuất ra một đoạn CData
(<!CDATA[ ]]>), việc xuât ra các text cần một tham số. WriteComment()
xuất ra một ghi chú theo định dạng XML. WriteChars() xuất ghi chi của của
một chuỗi các kí tự. Điều này cũng tương tự phương thức ReadChars() mà
chúng ta đã biết; chúng đều sử dụng cùng các tham số. WriteChars() cần một
vùng đệm (một mảng kí tự) Vị trí bắt đầu đẻ ghi (một số integer) số các kí tự
sẽ ghi (một số integer).
Thao tác đọc và ghi XML dùng các lớp xuất phát từ XmlReader và
XmlWriter đơn giản và mềm dẻo đến kinh ngạc. Tiếp theo chúng ta sẽ xem
xét DOM hoạt động như thế nào trong không gian tên System.Xml, thông
qua các lớp XmlDocument và XmlNode.


×