2

我有一个 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 但可以内联完成

很多谢谢

西蒙

4

1 回答 1

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-literals,这使得它更具可读性但本质上是做同样的事情。

使用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 ;-)。

于 2010-06-14T11:39:09.557 回答