【问题标题】:XML Validation with XSD schema - ValidationEventHandler info使用 XSD 模式进行 XML 验证 - ValidationEventHandler 信息
【发布时间】:2017-08-11 01:42:39
【问题描述】:

我有一个架构:

<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++;
}

【问题讨论】:

  • 因此您需要进行验证,说明如果国家/地区小于最小值 thrn,则应显示请输入长度大于 5 的字符串?
  • 但国家只是示例。还会有很多其他领域。我需要显示:“字段“国家”的长度小于 MinValue = 5!请更正!”
  • 准确说出你想要达到的目标?
  • 使用架构验证 XML,如果存在验证错误,我希望在反馈中返回正确且清晰的信息。因此,当 XML 中有长度为 4 的国家/地区时,我想显示客户端,它必须长于 4
  • 你在为此写java代码吗?

标签: xml validation c#-4.0 xsd schema


【解决方案1】:

据我所知,大多数模式验证器都只允许很少自定义错误报告。要生成专为最终用户设计的错误消息,最好使用 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 模式匹配,以使消息对最终用户更加友好。

(我的意图最终是在此验证报告中添加更多语义标记以使其更容易,例如编写&lt;facet&gt;minLength&lt;/facet&gt;&lt;facetValue&gt;5&lt;/facetValue&gt;。但这仍然是一个愿望。)

【讨论】:

  • 感谢您的回答。第一种方法需要准备 xsd 架构?我不能,因为我是从客户那里得到的,我必须用这个模式检查转换后的数据。第二种方式,我需要付费才能拥有带有模式验证的版本,是吗? ://
  • 是的,切换到 Schematron 是一个重大变化,这就是我建议第二个选项的原因。至于第二个选项,我假设您不会无缘无故地为您的客户提供服务,我也不会。
猜你喜欢
  • 2012-04-13
  • 2014-03-27
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2012-02-12
  • 2023-03-27
相关资源
最近更新 更多