如何为同一文本文件中不同键值数据匹配正确XML标签并转XML
如何将带多组头部标签的文本文件转换为XML?
首先咱们先捋清楚你的核心需求:你的文本文件里包含多组不同结构的数据,每组数据对应不同的头部标识(比如IT01、IT02),已经有了识别这些头部的类(比如IT01类),现在要把这些文本数据转换成你指定格式的XML文件。
先看你现有代码里的几个关键问题,咱们一步步调整优化:
现有代码的核心问题
- 记录类型判断逻辑错误:你现在是从外部的
IT01_FilePath文件读取内容判断类型,但实际应该从当前处理的每一行文本开头提取标识才对。 - 缺少XML节点写入逻辑:你实例化了
IT01类,但没有把类里解析好的属性(比如strref)对应写入到XML元素中。 - 空行处理缺失:文本文件拆分后大概率会有空行,直接处理会导致解析报错。
修改后的完整代码方案
咱们先调整核心的写入方法,再完善主逻辑:
主按钮事件(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
关键说明
- 记录类型判断:我假设每行前4位是标识(比如IT01),如果你的实际标识是其他长度(比如第1位),直接修改
str.Substring(0,4)为对应的长度即可。 - 分隔符处理:添加了无效分隔符的判断,避免后续解析出错。
- 空行处理:在主循环里跳过空行,防止解析空字符串导致的异常。
- XML结构匹配:通过
WriteElementString把类的属性和你期望的XML元素一一对应,完全符合你给出的XML示例结构。 - 资源管理:用
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
相关产品推荐
相关产品推荐

