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

如何为同一文本文件中不同键值数据匹配正确XML标签并转XML

如何将带多组头部标签的文本文件转换为XML?

首先咱们先捋清楚你的核心需求:你的文本文件里包含多组不同结构的数据,每组数据对应不同的头部标识(比如IT01、IT02),已经有了识别这些头部的类(比如IT01类),现在要把这些文本数据转换成你指定格式的XML文件。

先看你现有代码里的几个关键问题,咱们一步步调整优化:

现有代码的核心问题

  1. 记录类型判断逻辑错误:你现在是从外部的IT01_FilePath文件读取内容判断类型,但实际应该从当前处理的每一行文本开头提取标识才对。
  2. 缺少XML节点写入逻辑:你实例化了IT01类,但没有把类里解析好的属性(比如strref)对应写入到XML元素中。
  3. 空行处理缺失:文本文件拆分后大概率会有空行,直接处理会导致解析报错。

修改后的完整代码方案

咱们先调整核心的写入方法,再完善主逻辑:

主按钮事件(Button1_Click)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim myText As String = My.Computer.FileSystem.ReadAllText(Path & Filetxt)
    Dim ary As String() = myText.Split(vbCrLf)
    
    ' 使用Using自动管理资源,比手动Close更安全可靠
    Using writer As New XmlTextWriter(Path & FileXml, Encoding.ASCII)
        writer.Formatting = Formatting.Indented
        writer.Indentation = 4
        writer.WriteStartDocument(True)
        writer.WriteStartElement(RootEle) ' RootEle是你定义的根元素,比如"Data_Xml"
        
        For x As Integer = 0 To ary.Length - 1
            Dim line As String = ary(x).Trim()
            If Not String.IsNullOrEmpty(line) Then ' 跳过空行,避免无效解析
                Writestudent(writer, line)
            End If
        Next
        
        writer.WriteEndElement()
        writer.WriteEndDocument()
    End Using
End Sub

核心写入方法(Writestudent)

Private Sub Writestudent(ByVal wr As XmlWriter, ByVal str As String)
    '-----设置分隔符-----
    Dim strDelimiter As String = ComboBox1.Text
    If ComboBox1.SelectedIndex = -1 Then
        MsgBox("Please select a delimiter")
        Return ' 选择失败直接返回,避免后续报错
    End If
    
    ' 统一转换分隔符格式
    strDelimiter = strDelimiter.ToUpper()
    Select Case strDelimiter
        Case "T" : strDelimiter = vbTab
        Case "S" : strDelimiter = " "
        Case "C" : strDelimiter = ","
        Case "SC" : strDelimiter = ";"
        Case Else : MsgBox("Invalid delimiter selected") : Return
    End Select
    
    '-----提取当前行的记录类型(假设前4位是标识,比如IT01/IT02,可根据实际调整长度)-----
    Dim strRecordType As String = str.Substring(0, 4).Trim()
    Select Case strRecordType
        Case "IT01"
            ' 实例化IT01类,解析当前行数据
            Dim tmpRecIT01 As New IT01(str)
            ' 写入对应XML节点
            wr.WriteStartElement("DataTable")
            wr.WriteElementString("ref", tmpRecIT01.ref) ' 读取IT01类的公共属性
            ' 继续写入其他字段,比如你的期望XML里的order、number等
            ' wr.WriteElementString("order", tmpRecIT01.order)
            ' wr.WriteElementString("number", tmpRecIT01.number)
            wr.WriteEndElement()
        Case "IT02"
            ' 同理处理IT02类型:先定义IT02类,再解析写入XML
            ' Dim tmpRecIT02 As New IT02(str)
            ' wr.WriteStartElement("DataTable")
            ' wr.WriteElementString("xxx", tmpRecIT02.xxx)
            ' wr.WriteEndElement()
        Case Else
            ' 处理未知类型,可选跳过或写入错误节点
            wr.WriteStartElement("UnknownRecord")
            wr.WriteAttributeString("type", strRecordType)
            wr.WriteString(str)
            wr.WriteEndElement()
    End Select
End Sub

完善IT01类(添加公共属性)

你的IT01类目前只有私有变量,需要添加公共属性才能在外部访问解析后的数据:

Public Class IT01
    Private strref As String
    ' 可添加其他私有变量存储字段,比如order、number等
    ' Private strOrder As String
    ' Private strNumber As String
    
    Public Sub New()
    End Sub
    
    Public Sub New(ByVal strLine As String)
        InitializeComponent(strLine)
    End Sub
    
    Private Sub InitializeComponent(ByVal strLine As String)
        Dim strTemp As String = Nothing
        '-- 解析Record Identifier(根据你的文本样本调整截取位置,比如样本第1位是ref)
        strTemp = Strings.Mid(strLine, 1, 1).Trim
        If Not String.IsNullOrEmpty(strTemp) Then
            strref = strTemp
        End If
        ' 继续解析其他字段,比如用分隔符拆分后取对应位置的值
        ' Dim parts As String() = strLine.Split(" "c)
        ' If parts.Length >=2 Then strOrder = parts(1).Trim
    End Sub
    
    ' 公共只读属性,供外部访问解析后的ref值
    Public ReadOnly Property ref As String
        Get
            Return strref
        End Get
    End Property
    ' 添加其他字段的公共属性
    ' Public ReadOnly Property order As String
    '     Get
    '         Return strOrder
    '     End Get
    ' End Property
End Class

关键说明

  1. 记录类型判断:我假设每行前4位是标识(比如IT01),如果你的实际标识是其他长度(比如第1位),直接修改str.Substring(0,4)为对应的长度即可。
  2. 分隔符处理:添加了无效分隔符的判断,避免后续解析出错。
  3. 空行处理:在主循环里跳过空行,防止解析空字符串导致的异常。
  4. XML结构匹配:通过WriteElementString把类的属性和你期望的XML元素一一对应,完全符合你给出的XML示例结构。
  5. 资源管理:用Using语句自动管理XmlTextWriter资源,无需手动调用Close,更安全。

测试验证

用你提供的文本样本255 75 2 I I000002 PH +12 12345678FX,如果IT01类的ref取第1位(值为"2"),生成的XML会是这样:

<?xml version="1.0" encoding="us-ascii" standalone="yes"?>
<Data_Xml>
    <DataTable>
        <ref>2</ref>
        <!-- 其他解析后的字段会在这里显示 -->
    </DataTable>
</Data_Xml>

内容的提问来源于stack exchange,提问作者789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:01