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

另请参阅