如何在VB.NET中构建XML树从文本文件中读取元素名称?

时间:2011-09-06 17:29:49

标签: xml vb.net linq dom

我想做的事情比这更复杂,但我正试图克服这个障碍。

假设我有一个包含这些内容的文本文件:

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

'我真的很感激帮助。我整个星期一直在努力。

2 个答案:

答案 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()