C# Language
XDocument en de naamruimte System.Xml.Linq
Zoeken…
Genereer een XML-document
Het doel is om het volgende XML-document te genereren:
<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>
Code:
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);
Wijzig XML-bestand
Als u een XML-bestand met XDocument
wilt wijzigen, laadt u het bestand in een variabele van het type XDocument
, wijzigt u het in het geheugen, slaat u het op en overschrijft u het oorspronkelijke bestand. Een veel voorkomende fout is het wijzigen van de XML in het geheugen en verwachten dat het bestand op schijf verandert.
Gegeven een XML-bestand:
<?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>
U wilt de kleur van de banaan wijzigen in bruin:
- We moeten het pad naar het bestand op schijf kennen.
- Eén overbelasting van
XDocument.Load
ontvangt een URI (bestandspad). - Omdat het xml-bestand een naamruimte gebruikt, moeten we een query uitvoeren met de naamruimte EN elementnaam.
- Een Linq-query met C # 6-syntaxis voor de mogelijkheid van nulwaarden. Elke
.
gebruikt in deze query heeft het potentieel om een nulset te retourneren als de voorwaarde geen elementen vindt. Vóór C # 6 zou je dit in meerdere stappen doen en onderweg op nul controleren. Het resultaat is het element<Fruit>
dat de banaan bevat. Eigenlijk eenIEnumerable<XElement>
, daarom gebruikt de volgende stapFirstOfDefault()
. - Nu halen we het FruitColor-element uit het Fruit-element dat we zojuist hebben gevonden. Hier nemen we aan dat er maar één is, of we geven alleen om de eerste.
- Als het niet nul is, stellen we de FruitColor in op "Brown".
- Ten slotte slaan we het
XDocument
en overschrijven we het originele bestand op schijf.
// 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);
Het bestand ziet er nu zo uit:
<?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>
Genereer een XML-document met behulp van vloeiende syntaxis
Doel:
<FruitBasket xmlns="http://www.fruitauthority.fake">
<Fruit>
<FruitName>Banana</FruitName>
<FruitColor>Yellow</FruitColor>
</Fruit>
<Fruit>
<FruitName>Apple</FruitName>
<FruitColor>Red</FruitColor>
</Fruit>
</FruitBasket>
Code:
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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow