You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:33:40