Creazione di strutture ad albero XML in C# (LINQ to XML)
In questa sezione vengono fornite informazioni sulla creazione di strutture ad albero XML in C#.
Per ulteriori 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 alla struttura ad 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 utilizzare 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 ulteriori informazioni, vedere Introduzione ai valori letterali XML in Visual Basic.
Costruttori XElement
La classe XElement utilizza i costruttori seguenti per la costruzione funzionale. Notare che esistono altri costruttori per XElement, che tuttavia non vengono elencati in questa sede perché non utilizzati 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 oggetto 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 utilizzando 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);
L'output ottenuto eseguendo l'esempio è il seguente:
<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);
L'output ottenuto eseguendo l'esempio è il seguente:
<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 utilizzato 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);
L'output ottenuto eseguendo l'esempio è il seguente:
<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);
L'output ottenuto eseguendo l'esempio è il seguente:
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
Estendendo l'esempio precedente, è possibile creare un'intera struttura ad 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);
L'output ottenuto eseguendo l'esempio è il seguente:
<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 passare alcun contenuto al costruttore. Nell'esempio seguente creato un elemento vuoto.
XElement n = new XElement("Customer");
Console.WriteLine(n);
L'output ottenuto eseguendo l'esempio è il seguente:
<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 alla struttura ad 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.
// 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");
L'output ottenuto eseguendo l'esempio è il seguente:
Child1 was cloned
Child2 was attached