2017-08-10 2 views
1

Ich habe ein Schema:XML-Validierung mit XSD-Schema - Validation info

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="address"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string"/> 
       <xs:element name="street" type="xs:string"/> 
       <xs:element name="city" type="xs:string"/> 
       <xs:element name="country"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:minLength value="5"/> 
          <xs:maxLength value="8"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Und einfach XML-Datei (es ist nur Beispiel):

<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="address.xsd"> 
    <name>John Smith</name> 
    <street>109 Abbey Close</street> 
    <city>Hayes</city> 
    <country>UK</country> 
</address> 

ich ValidationEventHandler verwende, aber ich brauche, um Code Dies hat klare Informationen für den Kunden, was falsch ist. Zum Beispiel für Land, das nur 4 Länge hat, bekomme ich Fehler, dass Feld "Land" Länge weniger als MinValue hat.

Aber ich möchte Client-Informationen geben, was bedeutet "MinValue", so für dieses Beispiel "5".

Ich suchte das lange, aber ich konnte das nicht finden.

Haben Sie eine Idee, wie ich es tun kann?

Jetzt habe ich diesen Code:

public static bool Validate(Stream xml, Stream xsd) 
{ 
    ClearErrorMessage(); 
    try { 
     XmlTextReader tr = new XmlTextReader(xsd); 
     XmlSchemaSet schema = new XmlSchemaSet(); 

     schema.Add(null, tr); 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ValidationType = ValidationType.Schema; 
     settings.Schemas.Add(schema); 
     settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
     settings.ValidationEventHandler += new ValidationEventHandler(ErrorHandler); 
     XmlReader reader = XmlReader.Create(xml, settings); 

     while(reader.Read()) { 
     } 
     reader.Close(); 

     if(numErrors > 0) 
      throw new Exception(msgError); 

     return true; 
    } 
    catch(Exception e) { 
     msgError = "Validation failed\r\n" + msgError + " " + e.Message; 
     return false; 
    } 
} 

private static void ErrorHandler(object sender, ValidationEventArgs args) 
{ 
    msgError = msgError + "\r\n" + args.Message + " " + args.Exception.LineNumber; 
    numErrors++; 
} 
+0

so müssen Sie besagt eine Validierung setzen, wenn Land ist weniger als minimaler Wert thrn sollte es zeigen, bitte geben Sie eine Zeichenfolge größer als die Länge 5 ein? –

+0

aber Land ist nur ein Beispiel. Es wird viele andere Felder geben. Ich brauche zeigen: "Feld" Land "hat weniger Länge als MinValue = 5! Bitte korrigieren Sie dies!" – xThauron

+0

sagen Sie genau, was Sie erreichen möchten? –

Antwort

0

meisten Schema Validatoren, die ich von erlauben sehr wenig Anpassung von Fehlerberichterstattung wissen. Um Fehlermeldungen für Endbenutzer zu erstellen, sollten Sie besser mit Schematron arbeiten, da dies eines der Hauptziele des Designs darstellt. Ein anderer Ansatz wäre, den Schema-Validator von Saxon zu verwenden, der in der Lage ist, einen XML-Validierungsbericht zu generieren, den Sie dann mithilfe von XSLT in Endbenutzerbedingungen umwandeln können. Für Ihr Beispiel würde der Validierungsbericht sein:

<?xml version="1.0" encoding="UTF-8"?> 
<validation-report xmlns="http://saxon.sf.net/ns/validation" 
        system-id="file:/Users/mike/Desktop/temp/test.xml"> 
    <error line="6" 
      column="14" 
      path="/Q{}address[1]/Q{}country[1]" 
      xsd-part="2" 
      constraint="cvc-datatype-valid.1">The content "UK" of element &lt;country&gt; does not match the required simple type. Value "UK" contravenes the minLength facet "5" of the type of element country</error> 
    <meta-data> 
     <validator name="SAXON-EE" version="9.8.0.3"/> 
     <results errors="1" warnings="0"/> 
     <schema file="test.xsd" xsd-version="1.1"/> 
     <run at="2017-08-10T18:36:16.694+01:00"/> 
    </meta-data> 
</validation-report> 

Sie versuchen und XSLT-Pattern-Matching auf diese verwenden könnten die Nachrichten mehr Endbenutzer freundlicher zu machen.

(Meine Absicht war es schließlich mehr semantisches Markup zu diesem Validierungsbericht hinzufügen dies zu erleichtern, zum Beispiel <facet>minLength</facet> und <facetValue>5</facetValue> zu schreiben. Aber das bleibt ein Streben.)

+0

Vielen Dank für die Antwort. Erster Weg muss xsd Schema vorbereiten? Ich kann nicht, weil ich dies vom Client bekommen habe, und ich muss die konvertierten Daten mit diesem Schema überprüfen. Zweiter Weg, ich brauche bezahlen, um Version mit Schema Validierung, ja? :/ – xThauron

+0

Ja, der Wechsel zu Schematron ist eine signifikante Änderung und deshalb habe ich eine zweite Option vorgeschlagen. Was die zweite Option betrifft, nehme ich an, dass Sie Ihre Dienstleistungen nicht umsonst für Ihren Kunden erbringen, und ich auch nicht. –