希望轻松填充从 XSD 生成的 类,其中 DataSet 具有不同的架构
Hoping for easy filling of classes generated from an XSD, where the DataSet has a different schema
我在一个模式的数据库中有数据,我需要将其转换为另一个模式的 XML。
XML 是第 3 方专有消息/响应系统。我们可以访问提供所有实体和复杂类型细分的帮助文档,并且我们有 XSD 个文档。可能有数百种不同的 XML 文档请求变体,因为第 2 级和第 3 级元素包含范围从 2 到 200 的选择指示符。
当前采用的方法是一种蛮力方法 - 查询以将所有数据放入 DataSet 对象中,然后(使用帮助文档)通过将数据连接成字符串手动生成 XML .这种方法适用于我们需要的 2 或 3 个变体。
现在我们想要支持更多变体,我们想要摆脱蛮力方法。我们也落后了几个版本,但使用的是最受支持的版本,并且希望在考虑可扩展性的情况下解决问题。
我们做了什么?
我们从 XSD 文档生成了 classes,它给了我们 2300 + 部分 classes。我开始为每个 class 对象开发一个填充方法库,该对象使用坐标对象(table、列、行属性)到 DataSet 中的特定数据。但是意识到,我们需要遍历数据来填充坐标对象,问题就出现了
- 为什么当时不直接填充实际的 xml 对象?
如果每个数据集 table 都能够映射到单个 XML 对象,那么问题就不大了,但是单个对象的数据可能分布在多个 tables.
Idea 1
最近,我一直在考虑更多的 Factory/Builder 组合来创建/填充 xml 对象。
Idea 2
我的另一个想法是合并一个 属性 属性系统,该系统具有 table 名称、列名 - 当相同的 xml 对象获得相同的 属性 来自 DataSet 中的 2 个不同位置,基于第 2 级或第 3 级元素选择。总是可以添加另一个指示符(选择类型?),然后在 属性.
上具有多个属性
Idea 3
另一个考虑因素是重写存储过程以检索正确的 tables-to-objects 中的数据,我遇到的问题是将逻辑从代码移动到 SQL。它实际上只是将问题放在应用程序的不同区域。
第三方解决方案并非完全没有问题。我正在寻找有关如何解决此问题的建议。
更新:
生成的 XML 被写入文件,然后由第 3 方应用程序使用。
我们决定结合想法 1 和想法 2。
XSD 生成了 classes 数字 2300 +,它将用于生成一个填充的根对象,我们可以将其传递给 XmlSerializer class。它将生成我们需要传递给第 3 方工具的 xml。
xml 个 class 对象的根级和前 2 级将使用 Builder 和 Factory Design 模式生成。我们将使用生成的部分 classes 的副本通过接口或基础 classes 添加功能。
[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
{ }
我意识到这个问题的解释相当开放,因此可能不是一个很好的问题。对此我深表歉意。
感谢所有前来观看的人。
我在一个模式的数据库中有数据,我需要将其转换为另一个模式的 XML。
XML 是第 3 方专有消息/响应系统。我们可以访问提供所有实体和复杂类型细分的帮助文档,并且我们有 XSD 个文档。可能有数百种不同的 XML 文档请求变体,因为第 2 级和第 3 级元素包含范围从 2 到 200 的选择指示符。
当前采用的方法是一种蛮力方法 - 查询以将所有数据放入 DataSet 对象中,然后(使用帮助文档)通过将数据连接成字符串手动生成 XML .这种方法适用于我们需要的 2 或 3 个变体。
现在我们想要支持更多变体,我们想要摆脱蛮力方法。我们也落后了几个版本,但使用的是最受支持的版本,并且希望在考虑可扩展性的情况下解决问题。
我们做了什么? 我们从 XSD 文档生成了 classes,它给了我们 2300 + 部分 classes。我开始为每个 class 对象开发一个填充方法库,该对象使用坐标对象(table、列、行属性)到 DataSet 中的特定数据。但是意识到,我们需要遍历数据来填充坐标对象,问题就出现了 - 为什么当时不直接填充实际的 xml 对象?
如果每个数据集 table 都能够映射到单个 XML 对象,那么问题就不大了,但是单个对象的数据可能分布在多个 tables.
Idea 1
最近,我一直在考虑更多的 Factory/Builder 组合来创建/填充 xml 对象。
Idea 2
我的另一个想法是合并一个 属性 属性系统,该系统具有 table 名称、列名 - 当相同的 xml 对象获得相同的 属性 来自 DataSet 中的 2 个不同位置,基于第 2 级或第 3 级元素选择。总是可以添加另一个指示符(选择类型?),然后在 属性.
上具有多个属性Idea 3
另一个考虑因素是重写存储过程以检索正确的 tables-to-objects 中的数据,我遇到的问题是将逻辑从代码移动到 SQL。它实际上只是将问题放在应用程序的不同区域。
第三方解决方案并非完全没有问题。我正在寻找有关如何解决此问题的建议。
更新: 生成的 XML 被写入文件,然后由第 3 方应用程序使用。
我们决定结合想法 1 和想法 2。
XSD 生成了 classes 数字 2300 +,它将用于生成一个填充的根对象,我们可以将其传递给 XmlSerializer class。它将生成我们需要传递给第 3 方工具的 xml。
xml 个 class 对象的根级和前 2 级将使用 Builder 和 Factory Design 模式生成。我们将使用生成的部分 classes 的副本通过接口或基础 classes 添加功能。
[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
{ }
我意识到这个问题的解释相当开放,因此可能不是一个很好的问题。对此我深表歉意。
感谢所有前来观看的人。