Jak vytvořit dokument s obory názvů v jazyce C# (LINQ to XML)

Tento článek ukazuje, jak vytvářet dokumenty v jazyce C#, které mají obory názvů.

Příklad: Deklarace a inicializace výchozího oboru názvů

Chcete-li vytvořit prvek nebo atribut, který je v oboru názvů, nejprve deklarujete a inicializujete XNamespace objekt. Přetížení operátoru sčítání pak použijete ke kombinování oboru názvů s místním názvem vyjádřeným jako řetězec.

Následující příklad vytvoří dokument s jedním oborem názvů. Ve výchozím nastavení linQ to XML serializuje tento dokument s výchozím oborem názvů.

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

Tento příklad vytvoří následující výstup:

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

Příklad: Vytvoření dokumentu s oborem názvů a atributem

Následující příklad vytvoří dokument s jedním oborem názvů. Vytvoří také atribut, který deklaruje obor názvů s předponou oboru názvů. Chcete-li vytvořit atribut, který deklaruje obor názvů s předponou, vytvoříte atribut, kde název atributu je předpona oboru názvů a tento název je v Xmlns oboru názvů. Hodnota tohoto atributu je identifikátor URI oboru názvů.

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

Tento příklad vytvoří následující výstup:

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

Příklad: Vytvoření dokumentu, který má dva obory názvů, jeden s předponou

Následující příklad ukazuje vytvoření dokumentu, který obsahuje dva obory názvů. Jedním z nich je výchozí obor názvů, druhý je obor názvů s předponou.

Zahrnutím atributů oboru názvů do kořenového elementu jsou obory názvů serializovány tak, že http://www.adventure-works.com je výchozí obor názvů a www.fourthcoffee.com je serializován s předponou fc. Chcete-li vytvořit atribut, který deklaruje výchozí obor názvů, vytvoříte atribut s názvem xmlnsbez oboru názvů. Hodnota atributu je výchozí identifikátor URI oboru názvů.

// 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 XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Tento příklad vytvoří následující výstup:

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

Příklad: Vytvoření dokumentu, který má dva obory názvů, oba s předponami

Následující příklad vytvoří dokument, který obsahuje dva obory názvů, oba s předponami oboru názvů.

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

Tento příklad vytvoří následující výstup:

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

Příklad: Vytvoření oboru názvů pomocí rozbalených názvů

Dalším způsobem, jak dosáhnout stejného výsledku, je použít rozšířené názvy místo deklarování a vytváření objektu XNamespace .

Tento přístup má vliv na výkon. Pokaždé, když předáte řetězec, který obsahuje rozbalený název do LINQ to XML, musí LINQ to XML analyzovat název, najít atomizovaný obor názvů a najít atomizovaný název. Tento proces trvá čas procesoru. Pokud je výkon důležitý, můžete chtít deklarovat a používat XNamespace objekt explicitně.

Pokud je výkon důležitým problémem, další informace najdete v tématu Předběžné atomizace objektů XName.

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

Tento příklad vytvoří následující výstup:

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

Viz také