【问题标题】:XML Schema Validation of XElementXElement 的 XML 模式验证
【发布时间】:2012-04-01 18:12:23
【问题描述】:

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

为此,我有 3 个单独的 XSD 文件,它们为我的班级需要的 3 个 XElements 中的每一个定义架构,但是我在验证 XElement 与架构时遇到了一些问题。如果没有变通方法,似乎没有一种方法可以做到这一点。

从 MSDN 页面中,XElement.Validate() 扩展方法似乎适用于重新验证较大文件的子元素。 XmlSchemaObject 参数导致了我的问题,因为我不能假设它会出现在任何 XElements 中。我想我可以通过从我的XmlSchemaSet 中获取XmlSchemaElement 作为XmlSchemaObject 参数传递来解决这个问题,但是由于XmlSchemaSet 已经定义了所有内容,因此必须这样做似乎很奇怪。

在不首先验证整个 XDocument 的情况下验证带有架构的 XElement 是否有更好的选择?

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

【问题讨论】:

    标签: c# xml xsd linq-to-xml


    【解决方案1】:

    我了解您在使用提供的 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 框架可以提供的类似便利方法更费力。

    【讨论】:

    • 我不知道为什么我没有想到将代码包装在我自己的 XElement.Validate() 扩展方法中。现在你这么说似乎很合乎逻辑。创建XDocument 是另一个我也应该想到的好主意(我花了太多时间试图找出如何转换它,但我错过了明显的解决方案)。我会尝试两种方法,看看我更喜欢哪一种。
    猜你喜欢
    • 2011-06-02
    • 2010-11-22
    • 2013-05-22
    • 2011-07-23
    • 2010-10-25
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多