C# Language
XDocument e lo spazio dei nomi System.Xml.Linq
Ricerca…
Genera un documento XML
L'obiettivo è generare il seguente documento XML:
<FruitBasket xmlns="http://www.fruitauthority.fake">
<Fruit ID="F0001">
<FruitName>Banana</FruitName>
<FruitColor>Yellow</FruitColor>
</Fruit>
<Fruit ID="F0002">
<FruitName>Apple</FruitName>
<FruitColor>Red</FruitColor>
</Fruit>
</FruitBasket>
Codice:
XNamespace xns = "http://www.fruitauthority.fake";
XDeclaration xDeclaration = new XDeclaration("1.0", "utf-8", "yes");
XDocument xDoc = new XDocument(xDeclaration);
XElement xRoot = new XElement(xns + "FruitBasket");
xDoc.Add(xRoot);
XElement xelFruit1 = new XElement(xns + "Fruit");
XAttribute idAttribute1 = new XAttribute("ID", "F0001");
xelFruit1.Add(idAttribute1);
XElement xelFruitName1 = new XElement(xns + "FruitName", "Banana");
XElement xelFruitColor1 = new XElement(xns + "FruitColor", "Yellow");
xelFruit1.Add(xelFruitName1);
xelFruit1.Add(xelFruitColor1);
xRoot.Add(xelFruit1);
XElement xelFruit2 = new XElement(xns + "Fruit");
XAttribute idAttribute2 = new XAttribute("ID", "F0002");
xelFruit2.Add(idAttribute2);
XElement xelFruitName2 = new XElement(xns + "FruitName", "Apple");
XElement xelFruitColor2 = new XElement(xns + "FruitColor", "Red");
xelFruit2.Add(xelFruitName2);
xelFruit2.Add(xelFruitColor2);
xRoot.Add(xelFruit2);
Modifica file XML
Per modificare un file XML con XDocument
, devi caricare il file in una variabile di tipo XDocument
, modificarlo in memoria, quindi salvarlo, sovrascrivendo il file originale. Un errore comune consiste nel modificare l'XML in memoria e aspettarsi che il file sul disco cambi.
Dato un file XML:
<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
<Fruit>
<FruitName>Banana</FruitName>
<FruitColor>Yellow</FruitColor>
</Fruit>
<Fruit>
<FruitName>Apple</FruitName>
<FruitColor>Red</FruitColor>
</Fruit>
</FruitBasket>
Vuoi modificare il colore della banana in marrone:
- Dobbiamo conoscere il percorso del file su disco.
- Un sovraccarico di
XDocument.Load
riceve un URI (percorso del file). - Poiché il file xml utilizza uno spazio dei nomi, è necessario eseguire una query con lo spazio dei nomi E il nome dell'elemento.
- Una query Linq che utilizza la sintassi C # 6 per tenere conto della possibilità di valori nulli. Ogni
.
usato in questa query ha il potenziale per restituire un set nullo se la condizione non trova elementi. Prima del C # 6 lo farebbe in più passaggi, controllando la nullità lungo il percorso. Il risultato è l'elemento<Fruit>
che contiene la banana. In realtà unIEnumerable<XElement>
, che è il motivo per cui il prossimo passo utilizzaFirstOfDefault()
. - Ora estraiamo l'elemento FruitColor dall'elemento Fruit appena trovato. Qui assumiamo che ce ne sia solo uno, o ci interessa solo il primo.
- Se non è nullo, impostiamo il FruitColor su "Brown".
- Infine, salviamo l'
XDocument
, sovrascrivendo il file originale su disco.
// 1.
string xmlFilePath = "c:\\users\\public\\fruit.xml";
// 2.
XDocument xdoc = XDocument.Load(xmlFilePath);
// 3.
XNamespace ns = "http://www.fruitauthority.fake";
//4.
var elBanana = xdoc.Descendants()?.
Elements(ns + "FruitName")?.
Where(x => x.Value == "Banana")?.
Ancestors(ns + "Fruit");
// 5.
var elColor = elBanana.Elements(ns + "FruitColor").FirstOrDefault();
// 6.
if (elColor != null)
{
elColor.Value = "Brown";
}
// 7.
xdoc.Save(xmlFilePath);
Il file ora si presenta così:
<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
<Fruit>
<FruitName>Banana</FruitName>
<FruitColor>Brown</FruitColor>
</Fruit>
<Fruit>
<FruitName>Apple</FruitName>
<FruitColor>Red</FruitColor>
</Fruit>
</FruitBasket>
Genera un documento XML usando la sintassi fluente
Obbiettivo:
<FruitBasket xmlns="http://www.fruitauthority.fake">
<Fruit>
<FruitName>Banana</FruitName>
<FruitColor>Yellow</FruitColor>
</Fruit>
<Fruit>
<FruitName>Apple</FruitName>
<FruitColor>Red</FruitColor>
</Fruit>
</FruitBasket>
Codice:
XNamespace xns = "http://www.fruitauthority.fake";
XDocument xDoc =
new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
new XElement(xns + "FruitBasket",
new XElement(xns + "Fruit",
new XElement(xns + "FruitName", "Banana"),
new XElement(xns + "FruitColor", "Yellow")),
new XElement(xns + "Fruit",
new XElement(xns + "FruitName", "Apple"),
new XElement(xns + "FruitColor", "Red"))
));
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow