Как построить дерево XML в VB.NET, читая имена элементов из текстового файла? - PullRequest
1 голос
/ 06 сентября 2011

То, что я пытаюсь сделать, является более сложным, чем это, но я пытаюсь преодолеть это препятствие.

Допустим, у меня был текстовый файл с таким содержимым:

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 ]

2 голосов
/ 06 сентября 2011

Вы можете сделать это так:

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> 
0 голосов
/ 06 сентября 2011

Если все, что вам нужно, это добавить каждую строку в качестве дочернего элемента предыдущего элемента, тогда вы можете использовать что-то вроде этого.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...