2012-04-05 22 views
15

Potrzebuję zaimplementować metodę C#, która musi zweryfikować XML na zewnętrznym XSD i zwrócić wynik Boolean wskazujący, czy był dobrze uformowany, czy nie.Sprawdzanie poprawności XML przeciwko XSD w pojedynczej metodzie

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

Wiem, jak validate using a callback. Chciałbym wiedzieć, czy można to zrobić za pomocą jednej metody, bez użycia wywołania zwrotnego. Potrzebuję tego wyłącznie do celów kosmetycznych: muszę potwierdzić do kilkudziesięciu typów dokumentów XML, więc chciałbym, aby było tak proste, jak poniżej.

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

Odpowiedz

39

Istnieje kilka opcji, które mogę rozważyć w zależności od tego, czy chcesz używać wyjątków dla zdarzeń nietypowych.

Jeśli przekazać null jako delegata zwrotnego walidacji, większość wbudowanych metod sprawdzania rzuci wyjątek, jeśli XML jest źle uformowane, więc można po prostu złapać wyjątek i powrócić true/false zależności od sytuacji .

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

Innym rozwiązaniem, które przychodzi do głowy pcha granice swojej kryterium without using a callback. Zamiast przekazywać wstępnie zdefiniowaną metodę wywołania zwrotnego, można zamiast tego przekazać anonimową metodę i użyć jej do ustawienia wartości zwracanej.

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

Co to jest przestrzeń nazw? – hajirazin

+1

@hajirazin masz na myśli typ, to 'XNamespace'. Nie jest on zdefiniowany w tym fragmencie, ponieważ nie był on odpowiedni dla przykładu – psubsee2003

+0

nawet ja miałem takie same wymagania. działa również dla mnie. Dzięki. – hajirazin