LINQ to XML: как добавить дочерние элементы в цикл for-each? - PullRequest
1 голос
/ 04 августа 2009
Dim names() As String = {"one", "two", "three"}
Dim xml As XElement = Nothing
For Each name In names
  If xml Is Nothing Then
    xml = New XElement(name)
  Else
    xml.Add(New XElement(name)
  End If
Next

Приведенный выше код создаст что-то вроде этого:

  <One>
    <Two />
    <Three />
  </One>

Мне нужно что-то вроде этого:

  <One>
    <Two>
      <Three />
    </Two>
  </One>

Я пытался использовать xml.Elements.Last.Add(New XElement(name)), но метод Last по какой-то причине не обязательно возвращает последний элемент.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 августа 2009

Небольшое изменение вашего текущего кода сделает то, что вы хотите:

Dim names() As String = {"one", "two", "three"}
Dim xml As XElement = Nothing
For Each name In names
  Dim new_elem As New XElement(name)
  If xml IsNot Nothing Then
      xml.Add(new_elem)
  End If
  xml = new_elem
Next

EDIT:

Вы можете ввести другую переменную для хранения корневого элемента:

Function BuildTree() As XElement
    Dim tree As XElement = Nothing

    Dim names() As String = {"one", "two", "three"}
    Dim xml As XElement = Nothing
    For Each name In names
        Dim new_elem As New XElement(name)
        If tree Is Nothing Then
            tree = new_elem
        Else
            xml.Add(new_elem)
        End If
        xml = new_elem
    Next

    Return tree
End Function
0 голосов
/ 04 августа 2009

Похоже, вы просто хотите добавить XElement - не использовать. Последний или что-либо еще, добавление после последнего является поведением по умолчанию.

IOW:

Вы можете сказать:

Dim node1 as XElement = new XElement( "A1")
Dim node2 as XElement = new XElement( "A2")
Dim node3 as XElement = new XElement ("A3")
node2.Add( node3)
Dim root as XElement = new XElement("Root",new XElement(){node1,node2})

Чтобы получить:

<Root>
  <A1 />
  <A2>
    <A3 />
  </A2>
</Root>

Или сделать то же самое с:

Dim node1 as XElement = new XElement( "A1")
Dim node2 as XElement = new XElement( "A2")
Dim node3 as XElement = new XElement ("A3")
Dim root as XElement = new XElement("Root")
Dim children as XElement() = new XElement(){node1,node2}
for each child in children 
    root.add( child)
    if child.Name = "A2"
        child.Add( node3)
    end if
next

Если вы ищете последний узел для запуска в дереве (A3 в примере выше), вам нужно:

root.Descendants().Last()

Является ли это тем, что вам действительно нужно (задавая подобные вопросы, хорошо бы дать дерево и сказать, какие узлы вы хотите изолировать)?

...