2017-08-10 4 views
1

私はスキーマを持っている:XMLの検証 - のValidationEventHandler情報

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

そして、単にXMLファイル(これは一例です):

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

私はValidationEventHandlerを使用していますが、私はコードに必要これは何が間違っているクライアントのための明確な情報を持っている。たとえば、長さが4の国の場合、フィールド「国」の長さがMinValue未満であるというエラーが表示されます。

しかし、この例では "5"という意味で "MinValue"を意味するクライアント情報を提供したいと思います。

私はこれを長い間探していましたが、これを見つけることができませんでした。

どうすればいいですか?私が知っているのエラー報告はほとんどカスタマイズできるよう

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

ので、あなたがもし旨の検証を配置する必要があります国が最小値よりも小さい場合は、長さ5よりも長い文字列を入力してください。 –

+0

国は例に過ぎません。他にも多くの分野があります。 私はショーが必要です: "Field" country "MinValue = 5よりも長さが短い!これを修正してください! – xThauron

+0

あなたが達成したいことを正確に教えてください。 –

答えて

0

ほとんどのスキーマバリ:

は、今私はこのコードを持っています。エンドユーザ向けに設計されたエラーメッセージを生成するには、これを主要な設計目標の1つとして持つSchematronを使用する方がよいでしょう。

もう1つの方法は、XSLTを使用してエンドユーザーの用語に変換できるXML検証レポートを生成するSaxonのスキーマ検証ツールを使用する方法です。たとえば、検証レポートは次のようになります。

<?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> 

この場合、XSLTパターンマッチングを使用してメッセージをよりエンドユーザーに見やすくすることができます。

(私の意図は<facet>minLength</facet><facetValue>5</facetValue>を書い例えば、これを容易にするために、この検証報告書によりセマンティックなマークアップを追加し、最終的でした。しかし、これは誤嚥のまま。)

+0

ありがとうございました。 最初の方法ではxsdスキーマを準備する必要がありますか?私はクライアントからこれを取得しているので、私はできません、私はこのスキーマで変換されたデータをチェックする必要があります。 2番目の方法は、私はスキーマの検証とバージョンを持っている必要があります、はい? :/ – xThauron

+0

はい、Schematronへの切り替えは大きな変更です。そのため私は第2の選択肢を提案しました。第二の選択肢として、私はあなたがあなたのクライアントに何もサービスを提供していないと思っています。 –

関連する問題