Visual Basic 中的 XML 文本 (LINQ to XML)

本文提供了有关使用 xml 文本和嵌入式表达式在 Visual Basic 中创建 XML 树的信息。

示例:使用 XML 文本创建 XML 树

下面的示例演示如何创建包含 XML 文本的 XElement,在本例中为 contacts

Dim contacts As XElement = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone>206-555-0144</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

示例:使用 XML 文本创建具有简单内容的 XElement

可以创建包含简单内容的 XElement,如下所示:

Dim n as XElement = <Customer>Adventure Works</Customer>
Console.WriteLine(n)

该示例产生下面的输出:

<Customer>Adventure Works</Customer>

示例:使用 XML 文本创建空元素

可以创建一个空 XElement,如下所示:

Dim n As XElement = <Customer/>
Console.WriteLine(n)

该示例产生下面的输出:

<Customer />

使用嵌入式表达式创建内容

XML 文本的一个重要特性是允许使用嵌入式表达式。 使用嵌入式表达式可以对表达式进行计算,并将表达式的结果插入到 XML 树中。 如果表达式计算结果为 XElement 类型,则向树中插入元素。 如果表达式计算结果为 XAttribute 类型,则向树中插入属性。 只能将元素和属性插入到它们在树中有效的位置。

应当注意,只能将单个表达式放入嵌入式表达式。 不能嵌入多个语句。 如果表达式超过一行,必须使用行继续符。

如果使用嵌入式表达式将现有的节点(包括元素)和属性添加到新的 XML 树中,并且如果这些现有的节点已经有父级,则会克隆这些节点。 新克隆的节点将附加到新 XML 树中。 如果现有节点没有父级,则直接将这些节点附加到新 XML 树中。 本文最后一个示例对此进行了演示。

示例:使用嵌入式表达式插入元素

下面的示例使用嵌入式表达式将一个元素插入到树中:

xmlTree1 As XElement = _
    <Root>
        <Child>Contents</Child>
    </Root>
Dim xmlTree2 As XElement = _
    <Root>
        <%= xmlTree1.<Child> %>
    </Root>
Console.WriteLine(xmlTree2)

该示例产生下面的输出:

<Root>
  <Child>Contents</Child>
</Root>

示例:对内容使用嵌入式表达式

可以使用嵌入式表达式来提供元素的内容:

Dim str As String
str = "Some content"
Dim root As XElement = <Root><%= str %></Root>
Console.WriteLine(root)

该示例产生下面的输出:

<Root>Some content</Root>

示例:在嵌入式表达式中使用 LINQ 查询

可以使用 LINQ 查询结果作为元素的内容:

Dim arr As Integer() = {1, 2, 3}

Dim n As XElement = _
    <Root>
        <%= From i In arr Select <Child><%= i %></Child> %>
    </Root>

Console.WriteLine(n)

该示例产生下面的输出:

<Root>
  <Child>1</Child>
  <Child>2</Child>
  <Child>3</Child>
</Root>

示例:使用嵌入式表达式提供节点名称

还可以使用嵌入式表达式计算属性名称、属性值、元素名称和元素值:

Dim eleName As String = "ele"
Dim attName As String = "att"
Dim attValue As String = "aValue"
Dim eleValue As String = "eValue"
Dim n As XElement = _
    <Root <%= attName %>=<%= attValue %>>
        <<%= eleName %>>
            <%= eleValue %>
        </>
    </Root>
Console.WriteLine(n)

该示例产生下面的输出:

<Root att="aValue">
  <ele>eValue</ele>
</Root>

示例:使用嵌入式表达式克隆和附加节点

如前面所述,如果使用嵌入式表达式将现有节点(包括元素)和属性添加到新的 XML 树中,并且如果这些添加的节点已经有父级,则克隆这些节点,并将克隆的节点附加到新的 XML 树中。 如果现有节点没有父级,则直接将这些节点附加到新 XML 树中。

下面的代码演示将有父级的元素添加到树中,以及将没有父级的元素添加到树中时的行为。

' Create a tree with a child element.
Dim xmlTree1 As XElement = _
    <Root>
        <Child1>1</Child1>
    </Root>

' Create an element that's not parented.
Dim child2 As XElement = <Child2>2</Child2>

' Create a tree and add Child1 and Child2 to it.
Dim xmlTree2 As XElement = _
    <Root>
        <%= xmlTree1.<Child1>(0) %>
        <%= child2 %>
    </Root>

' Compare Child1 identity.
Console.WriteLine("Child1 was {0}", _
    IIf(xmlTree1.Element("Child1") Is xmlTree2.Element("Child1"), _
    "attached", "cloned"))

' Compare Child2 identity.
Console.WriteLine("Child2 was {0}", _
    IIf(child2 Is xmlTree2.Element("Child2"), _
    "attached", "cloned"))

该示例产生下面的输出:

Child1 was cloned
Child2 was attached

请参阅