XML验证 - 的ValidationEventHandler信息

问题描述:

我有一个模式: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

确切地告诉你想达到什么? –

大多数模式验证我所知道的允许错误报告的很少定制。为了生成为最终用户设计的错误消息,您最好使用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是一个重大变化,这就是为什么我建议第二个选项。至于第二种选择,我假设你没有为你的客户提供任何服务,我也没有。 –