XElement的XML模式验证

问题描述:

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

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

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

有没有更好的选择来验证XElement与模式没有首先验证整个XDocument

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

我明白你提供的API的问题,据我看来你有两个选择,一个是把你的XElement放入一个XDocument与例如。 XDocument doc = new XDocument(xElementToValidate);,然后致电the Validate method on that XDocument,其中所有您必须通过的是XmlSchemaSet,第二个选项是您自己概述的方式,即使用XElementValidate方法,确保您传递了XmlSchemaSet和根元素定义该模式设置为XmlSchemaObject。如果这些只是一个顶级元素定义的简单模式,您只需要

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

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

如果包裹两种方法之一进入一个方法,那么它应该不会比调用类似的简便方法.NET框架可能提供更多的努力。

+0

我不知道为什么我没有想到在我自己的'XElement.Validate()'扩展方法中包装代码。现在看来很符合你说的。创建一个'XDocument'是另一个好主意,应该也是我发生的事情(我花了太多时间试图找出如何转换它,而我错过了明显的解决方案)。我会试验两个,看看我更喜欢哪一个。 – psubsee2003 2012-04-03 00:22:41