我正在使用多个XElement
对象来为我的库中的多个对象提供一些用户指定的数据。我试图避免指定整个XML文件的结构,因为只要所需的特定元素正确构造,库就不应该关心整个XML的样子。
为此,我有3个单独的XSD
文件,为我的3个XElements
类需要定义模式,但是我遇到了一些问题,根据模式验证了XElement。如果没有解决方法,似乎没有办法做到这一点。
在MSDN页面中,XElement.Validate()
扩展方法似乎适合重新验证较大文件的子元素。 XmlSchemaObject
参数导致了我的问题,因为我不能认为它会出现在任何XElements
中。我想我可以通过从我的XmlSchemaElement
抓取XmlSchemaSet
作为XmlSchemaObject
参数来解决此问题,但由于XmlSchemaSet
已经定义了所有内容,因此似乎很奇怪必须这样做。
在没有首先验证整个XElement
的情况下,是否有更好的方法可以验证带有架构的XDocument
?
或者我应该让业务层处理应用程序中的模式验证,并让库假设XElement
已正确形成(我考虑过这个选项,但作为个人偏好更喜欢避免抛出异常而且会而只是让调用方法通过返回参数知道XElement
无效。)
答案 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框架可能提供的类似方便方法更加努力。