Вставить XElements с помощью LINQ Select? - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть исходный фрагмент xml, в который я хочу вставить несколько элементов, которые создаются в зависимости от определенных значений, найденных в исходном xml

В настоящее время у меня есть саб, который делает это для меня:

<Extension()>
Public Sub AddElements(ByVal xml As XElement, ByVal elementList As IEnumerable(Of XElement))

    For Each e In elementList
        xml.Add(e)
    Next

End Sub

И это вызывается в следующей процедуре:

Dim myElement = New XElement("NewElements")

myElement.AddElements(
     xml.Descendants("TheElements").
     Where(Function(e) e.Attribute("FilterElement") IsNot Nothing).
     Select(Function(e) New XElement("NewElement", New XAttribute("Text", e.Attribute("FilterElement").Value))))

Можно ли переписать это с использованием синтаксиса Linq, поэтому мне не нужно вызывать Sub AddElements, но я могу сделать все это в строке

Многие, Thx

Simon

1 Ответ

2 голосов
/ 14 июня 2010

Sure:

Dim outputxml = 
   New XElement("NewElements",
      xml.Descendants("TheElements").
      Where(Function(e) e.Attribute("FilterElement") IsNot Nothing).
      Select(Function(e) _
         New XElement("NewElement", 
            New XAttribute("Text",e.Attribute("FilterElement").Value)
         )
      )
   )

XElement и XAttribute имеют конструкторы, которые (в дополнение к имени элемента или атрибута) принимают произвольное количество объектов (которые сами могут быть запросами или другими IEnumerables). Все, что вы передаете конструктору, добавляется как содержимое.

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

С XML-литералами это выглядит так:

dim outputxml = 
   <NewElements><%=   
      From e In xml...<TheElements> 
      Where e.@FilterElement IsNot Nothing 
      Select <NewElement Text=<%= e.@FilterElement %>/>
   %></NewElements>
' you can embed names and attribute values too
  • <%= %> встраивает значение выражения VB в XML
  • xml...<elemname> выбирает потомков xml с именем elemname
  • 'elem. @ Attrname` получает значение атрибута

Это почти XQuery; -).

...