XElement的XML模式验证

7
我正在使用多个XElement对象来为我的库中的多个对象提供一些用户指定的数据。我试图避免指定整个XML文件的结构,因为只要所需的特定元素被正确地结构化,库就不关心整个XML的外观。
为此,我有3个单独的XSD文件,分别定义了我的类所需的每个XElement的模式,但是我在验证XElement与模式时遇到了一些问题。似乎没有方法可以在没有解决方法的情况下执行此操作。
从MSDN页面上看,XElement.Validate()扩展方法似乎是针对重新验证较大文件的子元素的。 XmlSchemaObject参数导致我的问题,因为我不能假设它将存在于任何XElements中。我认为我可以通过从我的XmlSchemaSet中获取XmlSchemaElement作为XmlSchemaObject参数来解决这个问题,但由于XmlSchemaSet已经定义了所有内容,因此必须这样做似乎很奇怪。
在没有先验证整个XDocument的情况下,是否有更好的选项来验证具有模式的XElement
或者,我应该让业务层在应用程序中处理模式验证,并让库假定XElement已正确形成(我考虑了这个选项,但作为个人喜好,我更喜欢避免抛出异常,而是通过返回参数告诉调用方法XElement无效)。
1个回答

12

我理解你在使用提供的API时遇到的问题,据我所见,你有两个选择。第一个是将你的XElement放入一个XDocument中,例如:XDocument doc = new XDocument(xElementToValidate);然后在那个XDocument上调用Validate方法,你只需传递XmlSchemaSet即可。第二个选项是你自己概述的方式,即使用XElementValidate方法,确保你传递了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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接