XElement的XML模式验证

时间:2012-04-01 18:12:23

标签: c# xml xsd linq-to-xml

我正在使用多个XElement对象来为我的库中的多个对象提供一些用户指定的数据。我试图避免指定整个XML文件的结构,因为只要所需的特定元素正确构造,库就不应该关心整个XML的样子。

为此,我有3个单独的XSD文件,为我的3个XElements类需要定义模式,但是我遇到了一些问题,根据模式验证了XElement。如果没有解决方法,似乎没有办法做到这一点。

在MSDN页面中,XElement.Validate()扩展方法似乎适合重新验证较大文件的子元素。 XmlSchemaObject参数导致了我的问题,因为我不能认为它会出现在任何XElements中。我想我可以通过从我的XmlSchemaElement抓取XmlSchemaSet作为XmlSchemaObject参数来解决此问题,但由于XmlSchemaSet已经定义了所有内容,因此似乎很奇怪必须这样做。

在没有首先验证整个XElement的情况下,是否有更好的方法可以验证带有架构的XDocument

或者我应该让业务层处理应用程序中的模式验证,并让库假设XElement已正确形成(我考虑过这个选项,但作为个人偏好更喜欢避免抛出异常而且会而只是让调用方法通过返回参数知道XElement无效。)

1 个答案:

答案 0 :(得分:10)

我理解您提供的API存在的问题,据我所知,您有两种选择,一种是将XElement放入XDocument,例如: XDocument doc = new XDocument(xElementToValidate);然后拨打the Validate method on that XDocument,您需要传递的是XmlSchemaSet,第二个选项就是您自己概述的方式,即使用Validate方法XElement,确保将XmlSchemaSet和该架构集中的根元素定义作为XmlSchemaObject传递。如果这些是只有一个顶级元素定义的简单模式,那么您只需要这样做。

    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.Add(null, "schema.xsd");
    schemaSet.Compile();

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First();

如果将两种方法中的一种方法包装到一个方法中,那么它应该比调用.NET框架可能提供的类似方便方法更加努力。