Condividi tramite


Creazione di alberi XML in C# (LINQ to XML)

Contenuto della sezione vengono fornite informazioni sulla creazione di alberi XML in C#.

Per altre informazioni sull'utilizzo dei risultati di query LINQ come contenuto di un oggetto XElement, vedere Costruzione funzionale (LINQ to XML).

Costruzione di elementi

Le firme dei costruttori XElement e XAttribute consentono di passare come argomenti del costruttore il contenuto dell'elemento o dell'attributo. Poiché uno dei costruttori accetta un numero variabile di argomenti, è possibile passare un qualsiasi numero di elementi figlio. Ognuno degli elementi figlio può naturalmente contenere elementi figlio. Per qualsiasi elemento è possibile aggiungere un qualsiasi numero di attributi.

Se quando si aggiungono oggetti XNode (incluso XElement) o XAttribute, il nuovo contenuto non ha elementi padre, gli oggetti vengono semplicemente collegati all'albero XML. Se invece il nuovo contenuto include già elementi padre e fa parte di un'altra struttura ad albero XML, viene duplicato e quindi collegato alla struttura ad albero XML. Tale comportamento è illustrato nell'ultimo esempio di questo argomento.

Per creare un oggetto XElement contacts, è possibile usare il codice seguente:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"), 
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

Se i rientri sono stati impostati correttamente, il codice per costruire oggetti XElement è molto simile alla struttura del codice XML sottostante.

In Visual Basic è disponibile un altro approccio per la creazione di strutture ad albero XML. È infatti possibile incorporare il codice XML nei programmi Visual Basic come valore letterale XML. Per altre informazioni, vedere Introduzione ai valori letterali XML in Visual Basic.

Costruttori XElement

La classe XElement usa i costruttori seguenti per la costruzione funzionale. Notare che esistono altri costruttori per XElement, che tuttavia non vengono elencati in questa sede perché non usati per la costruzione funzionale.

Costruttore

Descrizione

XElement(XName name, object content)

Crea un oggetto XElement. Il parametro name specifica il nome dell'elemento, mentre il parametro content ne specifica il contenuto.

XElement(XName name)

Crea un oggetto XElement il cui XName viene inizializzato in base al nome specificato.

XElement(XName name, params object[] content)

Crea un oggetto XElement il cui XName viene inizializzato in base al nome specificato. Gli attributi e/o elementi figlio vengono creati dal contenuto dell'elenco di parametri.

Il parametro content è estremamente flessibile. Supporta qualsiasi tipo di oggetto che corrisponde a un elemento figlio valido di un oggetto XElement. Ai tipi diversi di oggetti passati in questo parametro si applicano le regole seguenti:

  • Una stringa viene aggiunta come contenuto di tipo testo.

  • Un oggetto XElement viene aggiunto come elemento figlio.

  • Un oggetto XAttribute viene aggiunto come attributo.

  • Un oggetto XProcessingInstruction, XComment o XText viene aggiunto come contenuto di elemento figlio.

  • Viene enumerato un oggetto IEnumerable e queste regole vengono applicate in modo ricorsivo ai risultati.

  • Per qualsiasi altro tipo viene chiamato il metodo ToString e il risultato viene aggiunto come contenuto di tipo testo.

Creazione di un XElement con contenuto

È possibile creare un oggetto XElement con contenuto semplice usando una sola chiamata di metodo. A tale scopo, specificare il contenuto come secondo parametro, come illustrato di seguito:

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

Questo esempio produce il seguente output:

<Customer>Adventure Works</Customer>

È possibile passare come contenuto qualsiasi tipo di oggetto. Ad esempio, nel codice seguente viene creato un elemento il cui contenuto è un numero a virgola mobile:

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

Questo esempio produce il seguente output:

<Cost>324.5</Cost>

Il numero a virgola mobile viene sottoposto a boxing e quindi passato al costruttore. Il numero boxed viene convertito in una stringa e usato come contenuto dell'elemento.

Creazione di un XElement con un elemento figlio

Se si passa un'istanza della classe XElement come argomento del contenuto, il costruttore crea un elemento con un elemento figlio:

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

Questo esempio produce il seguente output:

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Creazione di un XElement con più elemento figlio

È possibile passare più oggetti XElement per il contenuto. Ognuno degli oggetti XElement viene incluso come elemento figlio.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

Questo esempio produce il seguente output:

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

Estendendo l'esempio precedente, è possibile creare un intero albero XML, come illustrato di seguito:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),                                                 
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

Questo esempio produce il seguente output:

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

Creazione di un elemento vuoto

Per creare un oggetto XElement vuoto, non viene passato nessun contenuto al costruttore. Nell'esempio seguente creato un elemento vuoto.

XElement n = new XElement("Customer");
Console.WriteLine(n);

Questo esempio produce il seguente output:

<Customer />

Collegamento eduplicazione

Come accennato in precedenza, se quando si aggiungono oggetti XNode (incluso XElement) o XAttribute, il nuovo contenuto non ha elementi padre, gli oggetti vengono semplicemente collegati all'albero XML. Se invece il nuovo contenuto include già elementi padre e fa parte di un altro albero XML, viene duplicato e quindi collegato all'albero XML.

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that is not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

Questo esempio produce il seguente output:

Child1 was cloned
Child2 was attached

Vedere anche

Concetti

Creazione di alberi XML