Een document maken met naamruimten in C# (LINQ naar XML)

In dit artikel wordt beschreven hoe u documenten maakt in C# met naamruimten.

Voorbeeld: Een standaardnaamruimte declareren en initialiseren

Als u een element of een kenmerk wilt maken dat zich in een naamruimte bevindt, declareert en initialiseert u eerst een XNamespace-object. Vervolgens gebruikt u de overbelasting van de toevoegingsoperator om de naamruimte te combineren met de lokale naam, uitgedrukt als een tekenreeks.

In het volgende voorbeeld wordt een document met één naamruimte gemaakt. LINQ naar XML serialiseert dit document standaard met een standaardnaamruimte.

// Create an XML tree in a namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<Root xmlns="http://www.adventure-works.com">
  <Child>child content</Child>
</Root>

Voorbeeld: Een document maken met een naamruimte en een kenmerk

In het volgende voorbeeld wordt een document met één naamruimte gemaakt. Er wordt ook een kenmerk gemaakt dat de naamruimte declareert met een naamruimtevoorvoegsel. Als u een kenmerk wilt maken dat een naamruimte met een voorvoegsel declareert, maakt u een kenmerk waarin de naam van het kenmerk het voorvoegsel van de naamruimte is en deze naam zich in de Xmlns naamruimte bevindt. De waarde van dit kenmerk is de URI van de naamruimte.

// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Voorbeeld: Een document maken met twee naamruimten, een met een voorvoegsel

In het volgende voorbeeld ziet u het maken van een document met twee naamruimten. De ene is de standaardnaamruimte, de andere is een naamruimte met een voorvoegsel.

Door naamruimtekenmerken op te neemt in het hoofdelement, worden de naamruimten geserialiseerd zodat http://www.adventure-works.com de standaardnaamruimte is en www.fourthcoffee.com wordt geserialiseerd met een voorvoegsel van fc. Als u een kenmerk wilt maken dat een standaardnaamruimte declareert, maakt u een kenmerk met de naam xmlns, zonder een naamruimte. De waarde van het kenmerk is de standaardnaamruimte-URI.

Als een standaardnaamruimtedeclaratie binnen het bereik valt, is deze van toepassing op onderliggende XElement objecten door de lokale namen vooraf te voegen aan het bijbehorende XNamespace-object. Aan de andere kant zijn standaardnaamruimtedeclaraties niet rechtstreeks van toepassing op kenmerknamen. XAttribute objecten in de standaardnaamruimte worden dus gedefinieerd door niet hun lokale naam te prefixen met het bijbehorende XNamespace object.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content",
        new XAttribute("DefaultNs", "default namespace"),
        new XAttribute(fc + "PrefixedNs", "prefixed namespace")
    ),
    new XElement(fc + "Child3", "c3 content",
        new XAttribute("DefaultNs", "default namespace"),
        new XAttribute(fc + "PrefixedNs", "prefixed namespace")
    )
);
Console.WriteLine(root);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<Root xmlns="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <DifferentChild>other content</DifferentChild>
  </fc:Child>
  <Child2 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c2 content</Child2>
  <fc:Child3 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c3 content</fc:Child3>

</Root>

Voorbeeld: Een document maken met twee naamruimten, beide met voorvoegsels

In het volgende voorbeeld wordt een document gemaakt dat twee naamruimten bevat, beide met voorvoegsels voor naamruimten.

XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "fc", fc.NamespaceName),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<aw:Root xmlns:aw="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <aw:DifferentChild>other content</aw:DifferentChild>
  </fc:Child>
  <aw:Child2>c2 content</aw:Child2>
  <fc:Child3>c3 content</fc:Child3>
</aw:Root>

Voorbeeld: Een naamruimte maken met behulp van uitgebreide namen

Een andere manier om hetzelfde resultaat te bereiken, is door uitgebreide namen te gebruiken in plaats van een XNamespace-object te declareren en te maken.

Deze benadering heeft gevolgen voor de prestaties. Telkens wanneer u een tekenreeks met een uitgebreide naam doorgeeft aan LINQ naar XML, moet LINQ naar XML de naam parseren, de atomiseerde naamruimte zoeken en de atomiseerde naam zoeken. Dit proces kost CPU-tijd. Als de prestaties belangrijk zijn, kunt u een XNamespace object expliciet declareren en gebruiken.

Als de prestaties een belangrijk probleem zijn, raadpleegt u Pre-Atomization of XName Objects voor meer informatie.

// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{http://www.adventure-works.com}Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement("{http://www.adventure-works.com}Child", "child content")
);
Console.WriteLine(root);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Zie ook