【问题标题】:Visual Basic - Using Relational datatables to create an XML FileVisual Basic - 使用关系数据表创建 XML 文件
【发布时间】:2017-09-07 19:59:58
【问题描述】:

我在 VisualStudio 2017 中使用 VisualBasic

我的程序的目标是使用datagridview生成一个xml文件。

我希望能够创建的 XML 应该如下所示:

 <dsetDataManager xmlns="http://tempuri.org/dsetDataManager.xsd">
  <NetworkAnalyzerTrace>
   <TraceName>S21ZoomedIn</TraceName> 
   <Channel>Channel1</Channel> 
   <Measurement>S21</Measurement> 
   <Format>LogMag</Format> 
   <MinFrequencyStartParam>1.5</MinFrequencyStartParam> 
   <MinFrequencyStartEnum>AutoSpanByBandwidthOrQ</MinFrequencyStartEnum> 
   <MinFrequencyStopParam /> 
   <MinFrequencyStopEnum /> 
   <FrequencyStartParam>4</FrequencyStartParam> 
   <FrequencyStartEnum>AutoSpanByBandwidthOrQ</FrequencyStartEnum> 
   <FrequencyStopParam /> 
   <FrequencyStopEnum /> 
   <NumPoints>101</NumPoints> 
   <SpecEquation>
    <Name>FrequencyDelta</Name> 
    <Filter>1</Filter> 
    <Band>1</Band> 
    <MinEquation>-(0.005 + TuneIndex * (0.003/250))</MinEquation> 
    <MaxEquation>0.005 + TuneIndex * (0.003/250)</MaxEquation> 
    <MinInclusion>Inclusive</MinInclusion> 
    <MaxInclusion>Inclusive</MaxInclusion>
   </SpecEquation>
  </NetworkAnalyzerTrace>
 </dsetDataManager>

我的数据集是“dsetDataManager”。我的数据表是“NetworkAnalyzerTrace”和“SpecEquation”。我创建这个 xml 文件的方式是使用:

dsetDataManager.writeXML('FilePath')

我使用 DataGridView 为每个表创建行。如何使用嵌套在“NetworkAnalyzerTrace”内的“SpecEquation”数据表编写 XML 文件?

我目前在“NetworkAnalyzerTrace”之外使用“SpecEquation”创建 XML 没有问题,问题只是将其插入到其他数据表中。

非常感谢

更新 谢谢大家的cmets,他们很有启发性。我做了更多研究,发现我遇到的主要问题是关于 DataTables 中的关系列。我想出了如何在表之间建立这些关系,并且 writeXML 函数将表嵌套在父表中。

【问题讨论】:

  • 将您的数据集转换为可以直接序列化为您的 xml 格式的类结构。要序列化的类可以通过复制上面的 xml 并执行 Edit >> Paste Special >> Paste XML as classes 在 IDE 中自动生成。然后通过添加获取数据表并将它们转换为类结构的方法来扩展生成的类。最后,序列化。
  • 另外,我认为您有提出一个体面问题的条件,但已经有一个结束投票认为这个问题过于宽泛。就目前而言,它可能是......但我建议您添加更多代码来解决有关数据表及其与 dgv 关系的任何问题。
  • 对不起,我是新手。我不太确定如何缩小问题范围:Writing a dataset to xml and nest data tables in the xml

标签: xml vb.net datagridview datatable


【解决方案1】:

按照@djv 的建议,为您的 XML 结构创建一个类。将每一行放在一个列表中并序列化该列表。这样就可以了:

第一类

Public Class Class1
    Public Property Id As Integer
    Public Property Name As String
    Public Property c2 As Class2

    Public Sub New()
    End Sub


    Public Sub New(i As Integer, s As String)
        Me.Id = i
        Me.Name = s
        Me.c2 = New Class2(i + 1000, "CLASS 2 " & s)
    End Sub
End Class

2 级

Public Class Class2
    Public Property MyId As Integer
    Public Property MyName As String

    Public Sub New()
    End Sub

    Public Sub New(i As Integer, s As String)
        Me.MyId = i
        Me.MyName = s
    End Sub
End Class

要序列化的代码。在表单中放置一个按钮

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim list As New List(Of Class1)
        For index As Integer = 1 To 2
            list.Add(New Class1(index, "OBJECT " & index.ToString))
        Next

        Dim serializer As New XmlSerializer(GetType(List(Of Class1)))
        Using stream As FileStream = File.OpenWrite("T:\SER.TXT")
            serializer.Serialize(stream, list)
        End Using
    End Sub
End Class

输出

<?xml version="1.0"?>
<ArrayOfClass1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Class1>
    <Id>1</Id>
    <Name>OBJECT 1</Name>
    <c2>
      <MyId>1001</MyId>
      <MyName>CLASS 2 OBJECT 1</MyName>
    </c2>
</Class1>
<Class1>
    <Id>2</Id>
    <Name>OBJECT 2</Name>
    <c2>
      <MyId>1002</MyId>
      <MyName>CLASS 2 OBJECT 2</MyName>
    </c2>
</Class1>
</ArrayOfClass1>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多