2009-11-01 25 views
5

Tôi không muốn làm bất cứ điều gì ưa thích, tôi chỉ muốn chắc chắn rằng một tài liệu là hợp lệ, và in một thông báo lỗi nếu nó không phải là. Google đã chỉ cho tôi this, nhưng có vẻ như XmlValidatingReader đã lỗi thời (ít nhất, đó là những gì MonoDevelop nói với tôi).Làm cách nào để xác thực tài liệu XML dựa vào DTD trong C#?

Chỉnh sửa: Tôi đang thử mẹo của Mehrdad nhưng tôi đang gặp sự cố. Tôi nghĩ rằng tôi đã có hầu hết nó, nhưng tôi không thể tìm thấy OnValidationEvent bất cứ nơi nào. Tôi lấy OnValidationEvent từ đâu?

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.DTD; 
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/); 
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings); 
+0

Nhân tiện, ý bạn là gì khi "chuyển thành C#". Mã của tôi * là * trong C# 3.0. –

+0

@Mehrdad: Xin lỗi, tôi đã viết rằng trong khi tôi vẫn đang học C# 1.0, và không biết rằng 'var' là hợp lệ trong C#. –

Trả lời

4

Thay vì tạo XmlValidatingReader class trực tiếp, bạn nên xây dựng một thích hợp XmlReaderSettings object và vượt qua nó như một cuộc tranh cãi với XmlReader.Create method:

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); 
var reader = XmlReader.Create("file.xml", settings); 

Phần còn lại là không thay đổi.

P.S. OnValidationEvent là tên của phương thức bạn khai báo để xử lý các sự kiện xác thực. Rõ ràng, bạn có thể loại bỏ dòng nếu bạn không muốn đăng ký các sự kiện xác nhận được nâng lên bởi XmlReader.

+0

Bạn nhận được OnValidationEvent từ đâu? Xem chỉnh sửa của tôi. –

+0

Matthew: Đó là phương pháp bạn khai báo để xử lý các sự kiện xác thực không thành công. Bạn có thể loại bỏ hoàn toàn dòng đó nếu bạn muốn nó ném ngoại lệ. –

2
var messages = new StringBuilder(); 
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message); 
var reader = XmlReader.Create("file.xml", settings); 

if (messages.Length > 0) 
{ 
    // Log Validation Errors 
    // Throw Exception 
    // Etc. 
} 

ValidationEventHandler

Lambda Expressions

Type Inference

+0

Um, không phải Mehrdad cung cấp cho câu trả lời cơ bản giống nhau, 22 phút trước khi bạn đã làm? –

+0

Câu trả lời này là một cách khác để hoàn thành cùng một điều. – ChaosPandion

-1

mô tả đầy đủ:

  1. Trong Visual Studio .NET, tạo ra một dự án Visual mới C# Console Application tên ValidateXml. Thêm hai sử dụng báo cáo đến đầu của Class1.cs như sau:

    using System.Xml;  // for XmlTextReader and XmlValidatingReader 
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later) 
    
  2. Trong Class1.cs, khai báo một biến boolean tên isValid trước khởi đầu của phương pháp Main như sau:

    private static bool isValid = true;  // If a validation error occurs, 
                 // set this flag to false in the 
                 // validation event handler. 
    
  3. Tạo đối tượng XmlTextReader để đọc tài liệu XML từ văn bản tệp theo phương pháp Main và sau đó tạo XmlValidatingReader đến validate dữ liệu XML này như sau:

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); 
    XmlValidatingReader v = new XmlValidatingReader(r); 
    
  4. Thuộc tính của đối tượng XmlValidatingReader ValidationType chỉ ra loại xác nhận được yêu cầu (DTD, XDR, hoặc Schema). Thiết lập thuộc tính này để DTD như sau:

    v.ValidationType = ValidationType.DTD; 
    
  5. Nếu bất kỳ lỗi xác nhận xảy ra, người đọc xác nhận sẽ tạo ra một sự kiện xác nhận.Thêm mã sau đây để đăng ký một xử lý sự kiện xác nhận (bạn sẽ thực hiện các phương pháp MyValidationEventHandler trong Bước 7):

    v.ValidationEventHandler += 
        new ValidationEventHandler(MyValidationEventHandler); 
    
  6. Thêm mã sau đây để đọc và xác nhận các tài liệu XML. Nếu bất kỳ lỗi xác thực nào xảy ra, MyValidationEventHandler được gọi là giải quyết lỗi. Phương thức này đặt isValid thành false (xem Bước 8). Bạn có thể kiểm tra trạng thái của isValid sau khi xác thực để xem tài liệu có hợp lệ hay không hợp lệ.

    while (v.Read()) 
    { 
        // Can add code here to process the content. 
    } 
    v.Close(); 
    
    // Check whether the document is valid or invalid. 
    if (isValid) 
        Console.WriteLine("Document is valid"); 
    else 
        Console.WriteLine("Document is invalid"); 
    
  7. Viết phương pháp MyValidationEventHandler sau khi phương pháp Main như sau:

    public static void MyValidationEventHandler(object sender, 
                  ValidationEventArgs args) 
    { 
        isValid = false; 
        Console.WriteLine("Validation event\n" + args.Message); 
    } 
    

xây dựng và chạy ứng dụng. Ứng dụng nên báo cáo rằng tài liệu XML là hợp lệ. ví dụ: Trong Visual Studio.NET, sửa đổi ProductWithDTD.xml để vô hiệu hóa nó (ví dụ: xóa phần tử <AuthorName>M soliman</AuthorName>). Chạy lại ứng dụng. Bạn sẽ nhận được thông báo lỗi sau:

Validation event 
Element 'Product' has invalid content. Expected 'ProductName'. 
An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). 
Document is invalid 
+1

Meh - đây chỉ là một bản sao/dán một số mẫu MSDN, gần như nguyên văn. Ít nhất, cung cấp một tham chiếu: http://support.microsoft.com/kb/307379 –

Các vấn đề liên quan