Validate XML against xsd schema with C#
Chúng ta có một file xml, một ứng dụng đọc ghi nó bằng C# và một file xsd định nghĩa cấu trúc của xml. Vậy làm sao kiểm tra dữ liệu đọc lên từ file xml và dữ liệu thu được từ ứng dụng có phù hợp xsd schema của nó hay không?
Bài này s cùng các bạn sẽ tìm hiểu về điều đó.
Việc kiểm tra rất có ích với ứng dụng của chúng ta, nó giúp loại bỏ được những lỗi không mong muốn từ sự thay đổi của file XML. Bài viết này s chỉ đề cập việc kiểm tra trên XSD schema với cách ghi đọc qua đối tượng XmlDocument ở bài trước .
Đây là cách mà chúng ta kiểm tra nội dung có phù hợp với XSD từ việc đọc file XML @link
private const string path = "books.xml";
private static XmlDocument xml;
static XmlReader reader;
public static XmlDocument Xml
{
get
{
if (xml == null)
{
//s/ Validate against xsd file when load xml file.
XmlReaderSettings s = new XmlReaderSettings();
s.Schemas.Add("", "books.xsd");
s.ValidationType = ValidationType.Schema;
reader = XmlReader.Create(path, s);
xml = new XmlDocument();
xml.Load(reader);
}
return xml;
}
}
Còn đây là đây là phần validate dữ liệu trước khi chúng ta Save xuống file XML
public static string SaveFile()
{
try
{
ValidationEventHandler he = new ValidationEventHandler(ValidationHandler);
Xml.Validate(he);
reader.Close();
if (isErrors > 0)
{
throw new Exception(ErrorMessage);
}
else {
Xml.Save(path);
}
}
catch (Exception error)
{
// XML Validation failed
//Console.WriteLine("XML validation failed." + "\r\n" + "Error Message: " + error.Message);
return error.Message;
}
return "";
}
public static void ValidationHandler(object sender,ValidationEventArgs args)
{
ErrorMessage = ErrorMessage + args.Message + "\r\n";
//s/ XML Validation failed
isErrors++;
}
Cho mình hỏi tại sao khi lúc đầu nhập có lỗi nhưng sau đó nhập đúng thì hàm kiểm tra vẫn báo các lỗi lúc trước và không thực hiện lưu xuống file XML?
ReplyDeleteCám ơn bạn đã giải đáp.
ReplyDeleteThật ra lúc đầu mình cũng đã nghĩ và thử như trên nhưng không được, biến thì reset thành công nhưng lỗi cũ vẫn còn. Loay hoay mãi mà không biết xóa lỗi cũ kiểu j. Đây là chương trình của mình: ValidateXMLdemo. Bạn xem giúp mình.
Mình làm được rồi. Thật ra ko chỉ reset biến mà còn phải reset cả XmlDocument nữa.
ReplyDelete@Salipro Phạm
ReplyDeleteCũng là hàm ResetError() trên ta cho thêm "xml = null;" Đó là cách mình làm.