2012-04-05 32 views
15

Tôi cần triển khai phương thức C# cần xác thực XML đối với XSD bên ngoài và trả về kết quả Boolean cho biết liệu nó có được định dạng tốt hay không.Xác thực XML dựa vào XSD theo một phương thức

public static bool IsValidXml(string xmlFilePath, string xsdFilePath); 

Tôi biết cách validate using a callback. Tôi muốn biết nếu nó có thể được thực hiện trong một phương pháp duy nhất, mà không cần sử dụng một cuộc gọi lại. Tôi cần điều này hoàn toàn cho các mục đích thẩm mỹ: Tôi cần xác nhận tối đa vài chục loại tài liệu XML vì vậy tôi muốn làm một cái gì đó đơn giản như dưới đây.

if(!XmlManager.IsValidXml(
    @"ProjectTypes\ProjectType17.xml", 
    @"Schemas\Project.xsd")) 
{ 
    throw new XmlFormatException(
     string.Format(
      "Xml '{0}' is invalid.", 
      xmlFilePath)); 
} 

Trả lời

39

Có một số tùy chọn tôi có thể nghĩ tùy thuộc vào việc bạn có muốn sử dụng ngoại lệ cho các sự kiện không đặc biệt hay không.

Nếu bạn vượt qua một null như các đại biểu xác nhận gọi lại, hầu hết được xây dựng trong phương pháp xác nhận sẽ ném một ngoại lệ nếu XML là xấu hình thành, vì vậy bạn chỉ có thể nắm bắt những ngoại lệ và trở true/false tùy theo tình huống .

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    try 
    { 
     xdoc.Validate(schemas, null); 
    } 
    catch (XmlSchemaValidationException) 
    { 
     return false; 
    } 

    return true; 
} 

Tùy chọn khác có ý định đẩy giới hạn của tiêu chí without using a callback của bạn. Thay vì chuyển một phương thức gọi lại được xác định trước, thay vào đó bạn có thể chuyển một phương thức nặc danh và sử dụng nó để đặt giá trị trả về true/false.

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    Boolean result = true; 
    xdoc.Validate(schemas, (sender, e) => 
     { 
      result = false; 
     }); 

    return result; 
} 
+2

Không gian tênName là gì? – hajirazin

+1

@hajirazin bạn có nghĩa là loại, đó là 'XNamespace'. Nó không được định nghĩa trong đoạn mã bởi vì nó không liên quan đến ví dụ – psubsee2003

+0

thậm chí tôi có cùng yêu cầu. cũng làm việc cho tôi. Cảm ơn. – hajirazin

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