2012-04-05 25 views
15

Harici bir XSD'ye karşı XML doğrulaması ve iyi oluşturulmuş olsun veya olmasın bir Boole sonucu döndürmesi gereken bir C# yöntemi uygulamanız gerekir.XSD'ye karşı XML'i tek bir yöntemle doğrulayın

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

nasıl validate using a callback biliyorum. Geri arama kullanmadan tek bir yöntemle yapılıp yapılamayacağını bilmek istiyorum. Bunu sadece kozmetik amaçlı kullanmam gerekiyor: Birkaç düzine kadar XML belgesini doğrulamaya ihtiyacım var, bu yüzden yapmak istediğim aşağıdaki gibi basit bir şey.

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

cevap

39

Olağandışı olmayan durumlar için istisnaları kullanmak isteyip istemediğinize bağlı olarak düşünebildiğim birkaç seçenek vardır.

doğrulama geri arama temsilci olarak bir null geçirirseniz, çoğu yerleşik doğrulama yöntemlerinden XML kötü oluşturulduğu takdirde sadece duruma göre true/false durum yakalamak ve dönüş böylece, bir özel durum oluşturur . akla gelen

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; 
} 

diğer seçenek without using a callback kriter sınırlarını zorluyor. Önceden tanımlı bir geri çağırma yöntemini iletmek yerine, anonim bir yöntem iletebilir ve true/false dönüş değerini ayarlamak için kullanabilirsiniz.

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

Burada bir namespaceName nedir? – hajirazin

+1

@hajirazin türünü kastediyorsunuz, bu XNamespace'. Snippet'te tanımlanmadığı için, aynı gerekliliğe sahip olsa bile, – psubsee2003

+0

örneğine uygun değildi. benim için de çalışıyor. Teşekkürler. – hajirazin

İlgili konular