XElement的XML模式验证

psu*_*003 7 c# xml xsd linq-to-xml

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

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

在MSDN页面中,XElement.Validate()扩展方法似乎适合于重新验证较大文件的子元素.这个XmlSchemaObject论点引起了我的问题,因为我无法假设它会出现在任何一个问题中XElements.我想我可以解决这个问题,抓住XmlSchemaElementXmlSchemaSet的传递作为XmlSchemaObject参数,但由于XmlSchemaSet已经定义了一切,所以必须这样做似乎很奇怪.

XElement没有首先验证整个模式的情况下,是否有更好的选项来验证模式XDocument

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

Mar*_*nen 11

我知道你有与所提供的API的问题,据我看到它,你有两个选择,一个是把你的XElementXDocument与例如XDocument doc = new XDocument(xElementToValidate);,然后调用Validate方法上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();
Run Code Online (Sandbox Code Playgroud)

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