验证传入的XML - 我应该同时使用XSD文件还是代码验证

时间:2013-11-08 19:38:35

标签: c# xml validation xsd

这是一个问题而不是技术问题,需要就验证XML的最佳方法提出建议。

我有一个用C#编写的Web服务,它接受传入的Xml请求。

目前我正在针对我的XSD架构验证传入的Xml。这很好用,我可以捕获任何错误并用适当的消息做出回应。

另外,我有以下函数可以传递我的对象,以验证所有属性;

    private List<ValidationResult> Validate(object oObject)
    {
        var results = new List<ValidationResult>();
        var context = new ValidationContext(oObject, serviceProvider: null, items: null);
        Validator.TryValidateObject(oObject, context, results, false);
        return results;
    }

我验证了定义的元素;

    [Required]
    [StringLength(175)]
    public string Name{ get; set; } 

该函数返回找到的任何错误的字符串列表。

提供XSD架构和类属性在验证要求方面是同步的,似乎我的代码永远不会返回函数中的结果列表

private List<ValidationResult> Validate(object oObject)

因为XSD架构阻止代码到达那一点。

这是执行XML验证的常用方法吗?

1 个答案:

答案 0 :(得分:1)

是的,在请求中执行两种类型的验证(XSD和特定于应用程序)是正常的。

XSD是对请求期望的可共享(和可执行)规范。能够根据XSD的共享规范自动通知客户请求问题是一个胜利。

但是,某些检查无法在XSD中表达(方便或完全)。例如,对于XSD 1.0,请参阅XSD 1.1 xs:assertion的所有动机示例。即使对于XSD 1.1,也可能需要或优先在XSD上对带外请求进行检查。例如,在以某种方式实现服务时可能需要执行级别检查,但服务接口不需要永久地负担检查。或者可能会使用一些复杂的,现存的程序代码来检查请求的某些方面,并且在XSD中以声明方式表达可能是不可能的或不实用的。

在XSD中尽可能多地放置验证限制,但也保留那些自然不适合的检查 - 第二级验证可能是有价值且实用的。