Så här skapar du ett dokument med namnområden i C# (LINQ till XML)

Den här artikeln visar hur du skapar dokument i C# som har namnområden.

Exempel: Deklarera och initiera ett standardnamnområde

Om du vill skapa ett element eller ett attribut som finns i ett namnområde deklarerar och initierar du först ett XNamespace objekt. Sedan använder du additionsoperatorns överlagring för att kombinera namnområdet med det lokala namnet, uttryckt som en sträng.

I följande exempel skapas ett dokument med ett namnområde. Som standard serialiserar LINQ till XML det här dokumentet med ett standardnamnområde.

// 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);

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett dokument som har ett namnområde och ett attribut

I följande exempel skapas ett dokument med ett namnområde. Det skapar också ett attribut som deklarerar namnområdet med ett namnområdesprefix. Om du vill skapa ett attribut som deklarerar ett namnområde med ett prefix skapar du ett attribut där namnet på attributet är namnområdesprefixet och det här namnet finns i Xmlns namnområde. Värdet för det här attributet är URI för namnområdet.

// 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);

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett dokument som har två namnområden, ett med ett prefix

I följande exempel visas hur du skapar ett dokument som innehåller två namnområden. Det ena är standardnamnområdet, det andra är ett namnområde med ett prefix.

Genom att inkludera namnområdesattribut i rotelementet serialiseras namnrymderna så att http://www.adventure-works.com är standardnamnområdet och www.fourthcoffee.com serialiseras med prefixet fc. Om du vill skapa ett attribut som deklarerar ett standardnamnområde skapar du ett attribut med namnet xmlns, utan ett namnområde. Värdet för attributet är standardnamnområdes-URI:n.

Om en deklaration för ett standardnamnområde är i kraft, tillämpas den på underordnade XElement-objekt genom att deras lokala namn får prefixet från det motsvarande XNamespace-objektet. Å andra sidan gäller standardnamnområdesdeklarationer inte direkt för attributnamn. Så XAttribute objekt i standardnamnområdet definieras av inte prefixet deras lokala namn med motsvarande XNamespace objekt.

// 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);

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett dokument som har två namnområden, båda med prefix

I följande exempel skapas ett dokument som innehåller två namnområden, båda med namnområdesprefix.

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

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett namnområde med hjälp av expanderade namn

Ett annat sätt att uppnå samma resultat är att använda expanderade namn i stället för att deklarera och skapa ett XNamespace objekt.

Den här metoden har prestandakonsekvenser. Varje gång du skickar en sträng som innehåller ett utökat namn till LINQ till XML måste LINQ till XML parsa namnet, hitta det atomiserade namnområdet och hitta det atomiserade namnet. Den här processen tar cpu-tid. Om prestanda är viktigt kanske du vill deklarera och använda ett XNamespace-objekt explicit.

Om prestandan är en viktig faktor, se Pre-atomisering av XName-objekt för mer information.

// 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);

Det här exemplet genererar följande utdata:

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

Se även