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
,第二个选项是您自己概述的方式,即使用XElement
的Validate
方法,确保您传递了XmlSchemaSet
和根元素定义该模式设置为XmlSchemaObject
。如果这些只是一个顶级元素定义的简单模式,您只需要
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "schema.xsd");
schemaSet.Compile();
XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First();
如果包裹两种方法之一进入一个方法,那么它应该不会比调用类似的简便方法.NET框架可能提供更多的努力。
我不知道为什么我没有想到在我自己的'XElement.Validate()'扩展方法中包装代码。现在看来很符合你说的。创建一个'XDocument'是另一个好主意,应该也是我发生的事情(我花了太多时间试图找出如何转换它,而我错过了明显的解决方案)。我会试验两个,看看我更喜欢哪一个。 – psubsee2003 2012-04-03 00:22:41