2010-08-05 7 views
2

Je ne connais pas assez l'espace de noms XML pour voir mon erreur. Le faites vous?Comment valider XML contre schéma (XSD)? Quelque chose ne va pas

public static bool ValidateXml(string xml, string xsd) 
    { 
     try 
     { 
      // build XSD schema 

      StringReader _XsdStream; 
      _XsdStream = new StringReader(xsd); 

      XmlSchema _XmlSchema; 
      _XmlSchema = XmlSchema.Read(_XsdStream, null); 

      // build settings (this replaces XmlValidatingReader) 

      XmlReaderSettings _XmlReaderSettings; 
      _XmlReaderSettings = new XmlReaderSettings() 
      { 
       ValidationType = ValidationType.Schema 
      }; 
      _XmlReaderSettings.Schemas.Add(_XmlSchema); 

      // build XML reader 

      StringReader _XmlStream; 
      _XmlStream = new StringReader(xml); 

      XmlReader _XmlReader; 
      _XmlReader = XmlReader.Create(_XmlStream, _XmlReaderSettings); 

      // validate 

      using (_XmlReader) 
      { 
       while (_XmlReader.Read()) 
        ; 
      } 

      // validation succeeded 

      return true; 
     } 
     catch 
     { 
      // validation failed 

      return false; 
     } 
    } 

Voici le XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://server.com/www/content" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="ads"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="ad"> 
     <xs:complexType> 
      <xs:attribute name="id" type="xs:string" use="required" /> 
      <xs:attribute name="date" type="xs:string" use="required" /> 
      <xs:attribute name="checksum" type="xs:string" use="required" /> 
      <xs:attribute name="size" type="xs:string" use="required" /> 
      <xs:attribute name="expanded-size" type="xs:string" use="required" /> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    <xs:attribute name="last-modified" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

Voici le XML

<?xml version="1.0" encoding="UTF-8" ?> 
<ads xmlns="http://server.com/www/content" last-modified=""> 
    <ad id="ad1" date="" checksum="" size="" expanded-size=""/> 
    <ad id="ad2" date="" checksum="" size="" expanded-size=""/> 
    <ad id="ad3" date="" checksum="" size="" expanded-size=""/> 
</ads> 

La méthode doit retourner faux, mais il est vrai retournaient. Honnêtement, je ne sais pas par où débuter ce débogage. : S

Merci d'avance pour votre temps et votre réponse.

+1

Au lieu d'attraper l'exception et de retourner false, pouvez-vous laisser sauter et couper-n-coller l'exception que vous recevez? – sarnold

Répondre