2010-12-03 8 views
1

Ich versuche XPathNavigator.CheckValidity zu verwenden, um ein XML-Dokument zu validieren. Irgendwie war ich in der Lage, Tests zu schreiben, die mit dieser Methode bestanden haben, aber jetzt (auf mysteriöse Weise) nicht mehr passieren. Das einzige, was ich mir vorstellen kann, ist die Umstellung von .NET 2 auf .NET 3.5, aber ich kann keine Dokumentation finden, die sich während des Übergangs ändert.XPathNavigator.CheckValidity validiert ungültiges XML-Dokument

Hier ist ein Beispiel-Programm:

void Main() 
{ 
    try 
    { 
     GetManifest().CreateNavigator().CheckValidity(GetSchemaSet(), (sender, args) => { 
      // never get in here when debugging 
      if (args.Severity == XmlSeverityType.Error) { 
       throw new XmlSchemaValidationException("Manifest failed validation", args.Exception); 
      } 
     }); // returns true when debugging 
    } 
    catch (XmlSchemaValidationException) 
    { 
     // never get here 
     throw; 
    } 

    // code here runs 
} 

IXPathNavigable GetManifest() 
{ 
    using (TextReader manifestReader = new StringReader("<?xml version='1.0' encoding='utf-8' ?><BadManifest><bad>b</bad></BadManifest>")) 
    { 
     return new XPathDocument(manifestReader); 
    } 
} 

XmlSchemaSet GetSchemaSet() 
{ 
    var schemaSet = new XmlSchemaSet(); 
    using (var schemaReader = new StringReader(Schema)){ 
     schemaSet.Add(XmlSchema.Read(schemaReader, null)); 
    } 

    return schemaSet; 
} 

const string Schema = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://www.engagesoftware.com/Schemas/EngageManifest""> 
    <xs:element name=""EngageManifest""> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name=""Title"" type=""xs:string"" /> 
     <xs:element name=""Description"" type=""xs:string"" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>"; 

ich die Lösung bei Validate XML with a XSD Schema without changing the XML using C# habe versucht, aber ich bin das gleiche Ergebnis zu erzielen ... Ich muss einige große Überlegung, wie diese Validierung Ding funktioniert nicht fehlen, aber ich kann es nicht sehen ...

Antwort

3

Das Problem ist, dass Ihr XML den Standardnamespace verwendet, aber das XSD spezifiziert einen Zielnamensraum. Wenn Sie in Ihrem XML-Code <BadManifest xmlns="http://www.engagesoftware.com/Schemas/EngageManifest"> angeben, sollten Sie feststellen, dass der Validierer Fehler wie erwartet meldet. Andernfalls ignoriert es den Namespace des XML-Codes und ignoriert ihn.

+0

Gibt es also eine Möglichkeit, das Schema zu validieren, ohne Xmlns im Dokument zu benötigen? Ist es nicht möglich, ein Dokument ohne xmlns mit einer XSD zu validieren, die einen targetNamespace angibt? – bdukes

+0

Grundsätzlich müssen sie übereinstimmen - soweit XML betrifft, sind Elemente mit dem gleichen Namen, aber verschiedenen Namespaces in keiner Weise verwandt. Sie haben die Wahl, entweder targetNamespace in der XSD zu belassen oder den Namespace in der XML-Datei festzulegen. Sie könnten den Namespace im XML-Code programmatisch festlegen, nachdem Sie ihn analysiert haben. Wenn Sie dies jedoch tun müssen, müssen Sie genau überlegen, welchen Zweck Ihr Namespace erfüllt und warum sich Ihr Eingabe-XML-Code nicht in diesem Namespace befindet Ort. – MarkXA

+0

Dies ist für vom Benutzer bereitgestellte Vorlagendokumente, so dass es erforderlich ist, dass sie den Namespace enthalten, was eine zu hohe Belastung darstellt. Ich wollte einen Namespace haben, so dass Intellisense automatischer wäre, aber es sieht so aus, als wäre es am einfachsten, den Namespace einfach zu entfernen, und sie können sich manuell mit dem XSD verbinden, wenn sie Intellisense wollen. – bdukes