Valori letterali XML in Visual Basic (LINQ to XML)

Questo articolo fornisce informazioni sulla creazione di alberi XML in Visual Basic tramite valori letterali XML ed espressioni incorporate.

Esempio: Usare valori letterali XML per creare un albero XML

Nell'esempio seguente viene illustrato come creare un oggetto XElement, in questo caso contacts, con valori letterali XML:

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>

Esempio: Usare valori letterali XML per creare un oggetto XElement con contenuto semplice

È possibile creare un oggetto XElement con contenuto semplice, come illustrato di seguito:

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

Nell'esempio viene prodotto l'output seguente:

<Customer>Adventure Works</Customer>

Esempio: Usare un valore letterale XML per creare un elemento vuoto

È possibile creare un oggetto XElement vuoto, come illustrato di seguito:

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

Nell'esempio viene prodotto l'output seguente:

<Customer />

Usare espressioni incorporate per creare contenuti

Un'importante funzionalità dei valori letterali XML è che consentono di usare espressioni incorporate. Con le espressioni incorporate è possibile valutare un'espressione e inserirne i risultati nell'albero XML. Se l'espressione restituisce un tipo di XElement, nell'albero viene inserito un elemento. Se l'espressione restituisce un tipo di XAttribute, nell'albero viene inserito un attributo. È possibile inserire elementi e attributi nell'albero solo nei casi in cui sono validi.

È importante notare che un'espressione incorporata può includere una sola espressione. Non è possibile incorporare più istruzioni. Se un'espressione si estende oltre una singola riga, è necessario usare il carattere di continuazione di riga.

Se si usa un'espressione incorporata per aggiungere nodi (inclusi elementi) e attributi esistenti a un nuovo albero XML e se per i nodi esistenti è già presente un elemento padre, i nodi vengono duplicati. I nuovi nodi duplicati vengono collegati al nuovo albero XML. Se per i nodi esistenti non è presente un elemento padre, i nodi vengono semplicemente collegati al nuovo albero XML. Questo comportamento è illustrato nell'ultimo esempio di questo articolo.

Esempio: Usare un'espressione incorporata per inserire un elemento

Nell'esempio seguente viene usata un'espressione incorporata per inserire un elemento nell'albero.

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

Nell'esempio viene prodotto l'output seguente:

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

Esempio: Usare un'espressione incorporata per i contenuti

È possibile usare un'espressione incorporata per fornire il contenuto di un elemento:

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

Nell'esempio viene prodotto l'output seguente:

<Root>Some content</Root>

Esempio: Usare una query LINQ in un'espressione incorporata

È possibile usare i risultati di una query LINQ per fornire il contenuto di un elemento:

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

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

Console.WriteLine(n)

Nell'esempio viene prodotto l'output seguente:

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

Esempio: Usare un'espressione incorporata per fornire i nomi dei nodi

È possibile usare un'espressione incorporata anche per calcolare nomi e valori di attributi ed elementi:

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)

Nell'esempio viene prodotto l'output seguente:

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

Esempio: Usare un'espressione incorporata per clonare e collegare nodi

Come accennato in precedenza, se si usa un'espressione incorporata per aggiungere nodi (inclusi elementi) e attributi esistenti a un nuovo albero XML e se per i nodi aggiunti è già presente un elemento padre, i nodi vengono clonati e i cloni vengono collegati al nuovo albero XML. Se per i nodi esistenti non è presente un elemento padre, i nodi vengono semplicemente collegati al nuovo albero XML.

Nel codice seguente viene illustrato il diverso comportamento relativo all'aggiunta di un elemento con o senza elemento padre a una struttura ad albero.

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

Nell'esempio viene prodotto l'output seguente:

Child1 was cloned
Child2 was attached

Vedi anche