C#/VB.NET如何配置DataSet生成指定嵌套结构的XML
问题结论
完全可以通过配置DataSet的表关系实现目标XML结构,你当前输出不符合预期的核心原因是:没有建立TblDef和Obj表的父子关联,也没有开启关系的嵌套输出配置,同时没有指定子节点集合的包裹层名称。
实现步骤
- 给两张表新增关联字段:父表
TblDef新增唯一主键列,子表Obj新增对应的外键列,所有子表行的外键值和父表记录的主键值保持一致,用来建立父子映射。 - 创建两表之间的
DataRelation对象:将关系名称设置为Objects(对应目标XML里包裹Obj的父节点名),同时将关系的Nested属性设为True,这是让子表节点嵌套到父节点内部的核心配置。 - 隐藏用于关联的主键、外键列:将这两个字段的
ColumnMapping设为Hidden,避免它们作为多余节点输出到XML中。 - (可选)自定义XmlWriter配置:可以控制输出的XML编码、缩进格式,替换默认的standalone声明。
修正后的完整VB.NET代码
Dim dsResult As New DataSet("MyDatasetName") Dim dr As DataRow Dim dt As New DataTable("TblDef") dt.Columns.Add(New DataColumn("Id", GetType(Integer))) ' 新增主键列用于关联 dt.Columns.Add(New DataColumn("Field1", Type.GetType("System.String"))) dt.Columns.Add(New DataColumn("Field2", Type.GetType("System.String"))) dr = dt.NewRow() dr("Id") = 1 dr("Field1") = "1" dr("Field2") = "9" dt.Rows.Add(dr) dsResult.Tables.Add(dt) Dim dtObjects As New DataTable("Obj") dtObjects.Columns.Add(New DataColumn("TblDefId", GetType(Integer))) ' 新增外键列用于关联 dtObjects.Columns.Add(New DataColumn("FieldA", Type.GetType("System.String"))) dtObjects.Columns.Add(New DataColumn("FieldB", Type.GetType("System.String"))) dtObjects.Columns.Add(New DataColumn("FieldC", Type.GetType("System.String"))) For index = 1 To 3 Dim drObj As DataRow drObj = dtObjects.NewRow() drObj("TblDefId") = 1 ' 关联到父表TblDef的Id=1的记录 drObj("FieldA") = "test " + index.ToString() drObj("FieldB") = "test" drObj("FieldC") = "test" dtObjects.Rows.Add(drObj) Next dsResult.Tables.Add(dtObjects) ' 建立父子关系,关系名对应XML中Obj集合的包裹节点名Objects Dim objRelation As New DataRelation("Objects", dt.Columns("Id"), dtObjects.Columns("TblDefId"), True) objRelation.Nested = True ' 开启嵌套输出,让子节点嵌入父节点下 dsResult.Relations.Add(objRelation) ' 隐藏关联字段,不输出到XML dt.Columns("Id").ColumnMapping = MappingType.Hidden dtObjects.Columns("TblDefId").ColumnMapping = MappingType.Hidden ' 输出XML(自定义格式控制编码和缩进) Dim settings As New XmlWriterSettings() settings.Indent = True settings.Encoding = Encoding.UTF8 Using writer As XmlWriter = XmlWriter.Create("output.xml", settings) dsResult.WriteXml(writer) End Using
输出效果
上述代码执行后输出的XML结构完全匹配目标Schema:
<?xml version="1.0" encoding="utf-8"?> <MyDatasetName> <TblDef> <Field1>1</Field1> <Field2>9</Field2> <Objects> <Obj> <FieldA>test 1</FieldA> <FieldB>test</FieldB> <FieldC>test</FieldC> </Obj> <Obj> <FieldA>test 2</FieldA> <FieldB>test</FieldB> <FieldC>test</FieldC> </Obj> <Obj> <FieldA>test 3</FieldA> <FieldB>test</FieldB> <FieldC>test</FieldC> </Obj> </Objects> </TblDef> </MyDatasetName>
内容的提问来源于stack exchange,提问作者Dmz
相关产品推荐
相关产品推荐

