我想做的事情比这更复杂,但我正试图克服这个障碍。
假设我有一个包含这些内容的文本文件:
LINE1
LINE2
LINE3
我希望将这些行中的每一行转换为XML文件,该文件将每行作为前一行的子元素。 输出应为:
<LINE1>
<LINE2>
<LINE3>
</LINE3>
</LINE2>
</LINE1>
我尝试了几种使用Linq到XML和XML DOM的方法,我总是这样:
<LINE1>
<LINE2>
<LINE3>
</LINE1> or some variation of that.
它似乎不支持深树。 我已经阅读了有关LINQ to XML的各种书籍页面和一些关于XML DOM的文章。 好像我可以花时间在VB.NET中编写一个只使用StreamWriter写出文本的程序。 当我发现你可以使用.ADD方法而不指定元素时,我认为我有一个突破。 我希望我能告诉你一些代码,但它确实令人费解。 为了保持这个简单,我将添加一些简单的代码然后我的其他代码。 但是我试图用我的代码做比这个例子更多的东西。
Private Sub BuildTree()
Dim elementList As New StreamReader("c:\thisfile.txt")
'The file contents vary
Do While elementList.Peek() >= 0
' code here to build the xml
' each line would add a new element that would be a child
' of the previous element
Loop
' Desired results "nested" elements
'<LINE1>
' <LINE2>
' <LINE3>
' </LINE3>
' </LINE2>
'</LINE1>
End Sub
' Here is the the code that I was experimenting with:
' I would get an object not set to a reference of an object error
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim isaElement As New XElement("DOC")
Dim element2Add As New XElement("NONAME")
element2Add.Name = isaElement.Name
Dim elementNames As New ArrayList
elementNames.Add("ISA")
elementNames.Add("GS")
elementNames.Add("ST")
Dim lastElement As New XElement("LAST")
Dim i As Integer = 0
For i = 0 To elementNames.Count - 1
element2Add = New XElement(elementNames(i).ToString)
If i = 0 Then
isaElement.Element("DOC").Add(elementNames(i))
Else
lastElement.Element(lastElement.Name).Add(element2Add)
End If
Next
isaElement.Save("c:\temp.xml")
Me.Close()
End Sub
'我真的很感激帮助。我整个星期一直在努力。
答案 0 :(得分:2)
你可以这样做:
Dim names = New String() { "LINE1", "LINE2", "LINE3" }
Dim doc = New XDocument
Dim previous As XContainer = doc
For Each name In names
Dim current = new XElement(name)
previous.Add(current)
previous = current
Next
上面的代码生成以下XML,我认为这就是你想要的:
<LINE1>
<LINE2>
<LINE3 />
</LINE2>
</LINE1>
答案 1 :(得分:0)
如果你需要实现的只是将每一行添加为前一个元素的子元素,那么你可以使用这样的东西。
Dim stringBuilder As New StringBuilder()
stringBuilder.AppendLine("LINE1")
stringBuilder.AppendLine("LINE2")
stringBuilder.AppendLine("LINE3")
Dim stringReader As New StringReader(stringBuilder.ToString())
Dim document As New XDocument
Dim previousElement As XElement = Nothing
Dim line As String = stringReader.ReadLine()
While Not line = Nothing
Dim element As New XElement(line)
If previousElement Is Nothing Then
document.Add(element)
Else
previousElement.Add(element)
End If
previousElement = element
line = stringReader.ReadLine()
End While
Dim xml As String = document.ToString()