2013-03-15 5 views
5

Was ich versuche zu tun, ist XML gegen eine XSD validieren. Das ist alles ziemlich einfach, aber ich habe ein Problem mit XML ohne Namespace. C# überprüft nur das XML, wenn der Namespace mit dem Zielnamespace des XSD übereinstimmt. Dies scheint richtig zu sein, aber ein XML ohne Namespace oder ein anderes, dann sollte das SchemaSet eine Ausnahme geben. Gibt es eine Eigenschaft oder eine Einstellung, um dies zu erreichen? Oder muss ich den Namespace manuell abrufen, indem ich das xmlns-Attribut der XML-Datei lese?XML-Validierung und Namespaces in. NET

Ein Beispiel clearify:

Code:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add("http://example.com", @"test.xsd"); 
settings.Schemas.Add("http://example.com/v2", @"test2.xsd"); 
settings.ValidationType = ValidationType.Schema; 

XmlReader r = XmlReader.Create(@"test.xml", settings); 

XmlReader r = XmlReader.Create(new StringReader(xml), settings); 
XmlDocument doc = new XmlDocument(); 
try 
{ 
    doc.Load(r); 
} 
catch (XmlSchemaValidationException ex) 
{ 

    Console.WriteLine(ex.Message); 
} 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="test"> 
     <xs:annotation> 
      <xs:documentation>Comment describing your root element</xs:documentation> 
     </xs:annotation> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:pattern value="[0-9]+\.+[0-9]+" /> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
</xs:schema> 

Valid XML:

<test xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</test> 

Ungültige XML, das nicht bestätigen wird:

<hello xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello> 

Fehler: The 'http://example.com:hello' element is not declared.

Ungültige XML, wird aber validieren, weil Namespace nicht vorhanden ist:

<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello> 

Wie kann ich dieses Problem beheben?

Jede Hilfe sehr geschätzt.

Antwort

3

Der Grund, warum ungültig Namespaces in XML sind die XmlSchemaValidationException nicht Auslösung, ist, weil es nur eine Warnung ist.

Also müssen wir den Code ändern, so dass auch Warnungen gemeldet werden.

Erste: Stellen Sie die Validationflags Eigenschaft im XmlReaderSettings

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings; 

PS: Validierung Flags Einstellung, stellen Sie sicher, dass Sie alle Flags gesetzt benötigt, sonst einige validationchecks werden übersprungen. Ich verwende ProcessIdentityConstraints, so dass meine Identity-Constraints (xs: key, xs: keyref, ...) auch validiert werden. Mehr Infos unter http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspx.

Weiter: dem Validator mitteilen, was zu tun ist, wenn eine Warnung gemeldet wird. Erstellen Sie ein Validator Ereignis, wird diese ausgelöst werden, wenn eine Warnung oder ein Fehler auftritt

private static void SchemaValidatorHandler(object sender, ValidationEventArgs e) 
    { 
     if (e.Severity == XmlSeverityType.Warning || e.Severity == XmlSeverityType.Error) 
     { 
      //Handle your exception 
     } 



    } 

Last: Stellen Sie den Validator-Ereignishandler für Ihre Validierung verwenden möchten

settings.ValidationEventHandler += new ValidationEventHandler(SchemaValidatorHandler); 

Das ist es

+0

Nein - ich habe es gerade versucht und der Validator feuert den Handler überhaupt nicht ab. Es scheint, dass .Net dies nicht als Warnung ansieht. –

1

ich finden kann, gibt es ein Verfahren für XmlDocument.Validate()
http://msdn.microsoft.com/en-us/library/ms162371.aspx

Ich glaube es wäre eine Ausnahme auslösen, wenn es einen Fehler in der XmlDocument ist und für den Namensraum nicht entspricht, es würde Warnung werfen. Sie können mehr über XmlValidation und Fehlertypen lesen. http://msdn.microsoft.com/en-us/library/aa310912%28v=vs.71%29.aspx

unter einem Ausschnitt aus Msdn Pasted
Warnung Wenn die Validation genannt und ist ein ValidationEventArgs.Severity übergeben, die auf XmlSeverityType.Warning entsprechen, die Verarbeitung des Dokumentes fortsetzt. Es wird keine Ausnahme ausgelöst und die Verarbeitung des Schemadokuments wird fortgesetzt. Fehler Wenn der ValidationEventHandler aufgerufen wird und eine ValidationEventArgs.Severity übergeben wird, die gleich XmlSeverityType.Error ist, wird die Verarbeitung des Dokuments fortgesetzt, und ungültige Daten werden verworfen. Eine Ausnahme wird ausgelöst und die Verarbeitung des Schemadokuments wird beendet.
Hoffnung hilft diese

+0

Danke für deine Antwort. Es half, mein Problem zu lösen – JeanD

+0

Ihre Begrüßung !!! –