2017-08-10 65 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的錯誤。

但我想給客戶端的信息是什麼意思「MinValue」,所以這個例子「5」。

我一直在尋找這個很長時間,但我找不到這個。

你知道我該怎麼做嗎?

現在我有這樣的代碼:

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

但國家只是例子。會有很多其他領域。 我需要顯示:「字段」國家「的長度小於MinValue = 5!請糾正此問題!」 – xThauron

+0

確切地告訴你想達到什麼? –

回答

0

大多數模式驗證我所知道的允許錯誤報告的很少定製。爲了生成爲最終用戶設計的錯誤消息,您最好使用Schematron,將其作爲其主要設計目標之一。

另一種方法是使用Saxon的模式驗證程序,該驗證程序能夠生成XML驗證報告,然後使用XSLT將其轉換爲最終用戶條款。對於您的示例驗證報告會:

<?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模式?我不能,因爲我從客戶端獲得了此信息,並且必須使用此架構檢查轉換後的數據。 第二種方式,我需要支付版本模式驗證,是嗎? :/ – xThauron

+0

是的,切換到Schematron是一個重大變化,這就是爲什麼我建議第二個選項。至於第二種選擇,我假設你沒有爲你的客戶提供任何服務,我也沒有。 –