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++;
}
大多数模式验证我所知道的允许错误报告的很少定制。为了生成为最终用户设计的错误消息,您最好使用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 <country> 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>
。但是,这仍然是一个愿望。)
谢谢你的回答。 第一种方式需要准备xsd模式?我不能,因为我从客户端获得了此信息,并且必须使用此架构检查转换后的数据。 第二种方式,我需要支付版本模式验证,是吗? :/ – xThauron
是的,切换到Schematron是一个重大变化,这就是为什么我建议第二个选项。至于第二种选择,我假设你没有为你的客户提供任何服务,我也没有。 –
,所以你需要把一个验证说明如果应该显示的国家小于最小值,请输入大于长度5的字符串? –
但国家只是例子。会有很多其他领域。 我需要显示:“字段”国家“的长度小于MinValue = 5!请纠正此问题!” – xThauron
确切地告诉你想达到什么? –