C# 从.NET中的文本文件构建XML树
我有一个显示树状结构的文本文件。空格数表示给定成员的级别。例如,以下组可以有成员或子组,这些成员或子组可以有成员,因此:C# 从.NET中的文本文件构建XML树,c#,xml,vb.net,tree,C#,Xml,Vb.net,Tree,我有一个显示树状结构的文本文件。空格数表示给定成员的级别。例如,以下组可以有成员或子组,这些成员或子组可以有成员,因此: MainGroup Member1 Member2 Group1 Member11 Member12 Group12 Member21 Member22 Member3 对不起各位, 我在这里的第一次也是第一个问题就是搞清楚整个格式化过程 这就是我迄今为止所尝试的: 我正在将文本文件读入datatable(这不是必需的,但我需要datatab
MainGroup
Member1
Member2
Group1
Member11
Member12
Group12
Member21
Member22
Member3
对不起各位,
我在这里的第一次也是第一个问题就是搞清楚整个格式化过程
这就是我迄今为止所尝试的:
Sub ExportToEXML
Dim datarow As DataRow
Dim fileName As String = ""
Dim level As Integer = 0
Dim counter As Integer = 0
Dim doc As XmlDocument = New XmlDocument
Dim docNode As XmlNode = doc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
doc.AppendChild(docNode)
Dim ComponentsNode As XmlNode = doc.CreateElement("Components")
doc.AppendChild(ComponentsNode)
Dim firstrow As DataRow
For i As Integer = 0 To dt.Rows.Count - 1
firstrow = dt.Rows.Item(i)
fileName = firstrow(0)
level = CountSpacesBeforeFirstChar(fileName)
Dim partNode As XmlNode = doc.CreateElement("Component")
Dim att As XmlAttribute = doc.CreateAttribute("Name")
att.Value = fileName
partNode.Attributes.Append(att)
GetChildNodes(partNode, i, doc, 0, level, dt)
ComponentsNode.AppendChild(partNode)
Next
doc.Save("D:\TestXML.xml")
End Sub
Private Sub GetChildNodes(ByRef xNode As XmlNode, ByRef rowInd As Integer, ByRef xDoc As XmlDocument, level As Integer, table As DataTable)
Dim lev As Integer
Dim fileName As String
Dim dr As DataRow
For i As Integer = rowInd + 1 To table.Rows.Count - 1
dr = table.Rows.Item(i)
fileName = dr(0)
lev = CountSpacesBeforeFirstChar(fileName)
If lev = 0 Then 'has no children
Exit Sub
End If
If lev > level Then
Dim partNode As XmlNode = xDoc.CreateElement("Component")
Dim att As XmlAttribute = xDoc.CreateAttribute("Name")
att.Value = fileName
partNode.Attributes.Append(att)
xNode.AppendChild(partNode)
GetChildNodes(xNode, i, xDoc, lev, table)
End If
Next
End Sub
那么,您应该读取文件(如果文件不太大,则将整个文件读取到内存中,否则就不会),创建一个空XML文档,遍历行,并根据行的缩进创建新节点并将它们添加到相应的XML元素(例如,跟踪每一级别的“最后一个”节点并将其作为子元素添加)。当然,您可以将XML创建延迟到稍后的阶段,然后基于文件内容构建对象层次结构,并在完成后将其序列化。或者整个事情都可以用智能正则表达式来完成。有很多可能的解决办法
但坦率地说:在这样一个地方,你不可能不费吹灰之力就能神奇地获得代码。(好吧,有时是这样,但尽管如此:在你提出一个非常普遍的问题之前,向我们展示你为实际解决问题所做的一些努力。)以下是一个相对简洁的方法:
Sub ParseHierarchy(ByRef inputFilePath As String, ByRef outputFilePath As String)
' We'll treat depth as zero-based to match the number of spaces in the lines
Dim depth As Integer = -1
Dim settings As XmlWriterSettings = New XmlWriterSettings
settings.Indent = True
Using writer As XmlWriter = XmlWriter.Create("testxml.xml", settings)
For Each line As String In File.ReadLines(inputFilePath)
Dim nextDepth As Integer = GetLineDepth(line)
If nextDepth - depth > 1 Then
Throw New ApplicationException( _
"Depth cannot increase by more than 1 at a time.")
End If
'' Close any elements at a deeper or the same depth as the next one
CloseElements(writer, depth - nextDepth + 1)
depth = nextDepth
writer.WriteStartElement("Component")
writer.WriteAttributeString("Name", line.Trim())
Next
'' Close any elements that are still open
CloseElements(writer, depth + 1)
End Using
End Sub
Private Sub CloseElements(ByRef writer As XmlWriter, ByVal count As Integer)
For i = 1 To count
writer.WriteEndElement()
Next
End Sub
Private Function GetLineDepth(line As String) As Integer
Return Regex.Match(line, "^\s*").Length
End Function
在示例文件上运行时,输出为:
<Component Name="MainGroup">
<Component Name="Member1" />
<Component Name="Member2" />
<Component Name="Group1">
<Component Name="Member11" />
<Component Name="Member12" />
<Component Name="Group12">
<Component Name="Member21" />
<Component Name="Member22" />
</Component>
</Component>
<Component Name="Member3" />
</Component>
您尝试了什么?你在哪里遇到问题?发布你的代码。你能解释一下“空格数表示给定成员的级别”是什么意思吗?它是固定宽度的文本文件吗?这正是我想要做的。非常感谢。