【问题标题】:Hoping for easy filling of classes generated from an XSD, where the DataSet has a different schema希望轻松填充从 XSD 生成的类,其中 DataSet 具有不同的架构
【发布时间】:2019-04-24 18:16:17
【问题描述】:

我在一个架构中的数据库中有数据,我需要将其转换为另一个架构的 XML。

XML 是第 3 方专有的消息/响应系统。我们可以访问一个帮助文档,该文档对所有实体和复杂类型进行了细分,并且我们有 XSD 文档。可能有数百种不同的 XML 文档请求变体,因为 2 级和 3 级元素包含范围从 2 到 200 的选择指示符。

当前采用的方法是蛮力方法 - 查询以将所有数据放入 DataSet 对象,然后(使用帮助文档)通过将数据连接成字符串手动生成 XML。这种方法适用于我们需要的 2 或 3 个变体。

现在我们想要支持更多的变化,我们想要摆脱蛮力方法。我们也落后了几个版本,但使用的是最受支持的版本,并希望在解决方案时考虑到可扩展性。

我们做了什么? 我们从 XSD 文档中生成了类,该文档为我们提供了 2300 多个部分类。我开始为每个使用坐标对象(表、列、行属性)到 DataSet 中的特定数据的类对象开发填充方法库。但是意识到,我们需要检查数据来填充坐标对象,问题就出现了 - 为什么不当时只填充实际的 xml 对象?

如果每个数据集表都能够映射到单个 XML 对象,那么问题就不会那么大了,但是单个对象的数据很可能分布在多个表中。

Idea 1

最近,我一直在考虑更多的 Factory / Builder 组合来创建 / 填充 xml 对象。

Idea 2

我的另一个想法是合并具有表名和列名的属性属性系统 - 当同一个 xml 对象基于 2 级或 3 级元素选择从 DataSet 中的 2 个不同位置获取相同属性时,这会遇到问题.总是可以添加另一个指示符(选择类型?),然后在一个属性上具有多个属性。

Idea 3

另一个考虑是重写存储过程以检索正确的表到对象中的数据,我遇到的问题是将逻辑从代码移动到 SQL。它实际上只是将问题放在应用程序的不同区域。

第三方解决方案并非完全不可能。我正在寻找有关如何解决此问题的建议。

更新: 生成的 XML 被写入文件,然后由第 3 方应用程序使用。

【问题讨论】:

  • 为什么要传递数据?只需使用数据库传输数据。一个应用程序可以将数据存储为 ID 123456,然后只需将 ID 传递给其他应用程序,让其他应用程序通过 ID 123456 提取数据。

标签: c# xml xsd


【解决方案1】:

我们决定将创意 1 和创意 2 结合起来。
XSD 生成的类编号为 2300 +,它将用于生成填充的根对象,我们可以将其传递给 XmlSerializer 类。它将生成我们需要传递给 3rd 方工具的 xml。

将使用 Builder 和 Factory Design 模式生成 xml 根和顶级 2 级类对象。我们将使用生成的部分类的副本通过接口或基类添加功能。

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://temp")]
[System.Xml.Serialization.XmlRootAttribute("NumberType", Namespace = "http://temp", IsNullable = false)]    
public partial class IdGroup
{

    private string idField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    [CustomPropertyAttribute("TableName", "ColumnName", Level2Type)]
    [CustomPropertyAttribute("AltTableName", "AltColumnName", AltLevel2Type)]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

public partial class IdGroup : IExtendFunctionality
{ }

我意识到这个问题很容易解释,因此可能不是一个很好的问题。对此我深表歉意。

感谢所有过来看看的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 2011-02-18
    • 2012-10-19
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多