使用LINQ Select插入XElements?

时间:2010-04-27 14:15:16

标签: xml linq linq-to-xml xelement

我有一个xml的源代码片段,我要插入多个元素,这些元素的创建取决于原始xml中的某些值

目前我有一个sub为我做这个:

<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

西蒙

1 个答案:

答案 0 :(得分:2)

不确定

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)
         )
      )
   )

XElementXAttribute具有构造函数(除元素或属性名称外)还接受任意数量的对象(它们本身可以是查询或其他IEnumerables)。传递给构造函数的任何内容都将作为内容添加。

您可能还想查看XML文字,这使得它更具可读性,但基本上可以做同样的事情。

使用XML Literals,它看起来像这样:

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
  • <%= %>在XML中嵌入VB表达式的值
  • xml...<elemname>选择名为elemname
  • 的xml后代
  • 'elem。@ attrname`获取属性的值

这几乎是XQuery; - )。