Jak utworzyć dokument z przestrzeniami nazw w języku C# (LINQ to XML)

W tym artykule pokazano, jak tworzyć dokumenty w języku C#, które mają przestrzenie nazw.

Przykład: deklarowanie i inicjowanie domyślnej przestrzeni nazw

Aby utworzyć element lub atrybut, który znajduje się w przestrzeni nazw, należy najpierw zadeklarować i zainicjować XNamespace obiekt. Następnie użyj przeciążenia operatora dodawania, aby połączyć przestrzeń nazw z nazwą lokalną wyrażoną jako ciąg.

Poniższy przykład tworzy dokument z jedną przestrzenią nazw. Domyślnie LINQ to XML serializuje ten dokument z domyślną przestrzenią nazw.

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

Ten przykład generuje następujące wyniki:

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

Przykład: tworzenie dokumentu, który ma przestrzeń nazw i atrybut

Poniższy przykład tworzy dokument z jedną przestrzenią nazw. Tworzy również atrybut, który deklaruje przestrzeń nazw z prefiksem przestrzeni nazw. Aby utworzyć atrybut, który deklaruje przestrzeń nazw z prefiksem, należy utworzyć atrybut, w którym nazwa atrybutu jest prefiksem przestrzeni nazw, a ta nazwa znajduje się w Xmlns przestrzeni nazw. Wartość tego atrybutu to identyfikator URI przestrzeni nazw.

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

Ten przykład generuje następujące wyniki:

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

Przykład: utwórz dokument, który ma dwie przestrzenie nazw, jeden z prefiksem

W poniższym przykładzie pokazano tworzenie dokumentu zawierającego dwie przestrzenie nazw. Jedną z nich jest domyślna przestrzeń nazw, druga to przestrzeń nazw z prefiksem.

Uwzględniając atrybuty przestrzeni nazw w elemercie głównym, przestrzenie nazw są serializowane tak, że http://www.adventure-works.com jest to domyślna przestrzeń nazw i www.fourthcoffee.com jest serializowana z prefiksem fc. Aby utworzyć atrybut, który deklaruje domyślną przestrzeń nazw, należy utworzyć atrybut o nazwie xmlns, bez przestrzeni nazw. Wartość atrybutu jest domyślnym identyfikatorem URI przestrzeni nazw.

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

Ten przykład generuje następujące wyniki:

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

Przykład: tworzenie dokumentu, który ma dwie przestrzenie nazw, oba z prefiksami

Poniższy przykład tworzy dokument zawierający dwie przestrzenie nazw, oba z prefiksami przestrzeni nazw.

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

Ten przykład generuje następujące wyniki:

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

Przykład: tworzenie przestrzeni nazw przy użyciu rozszerzonych nazw

Innym sposobem osiągnięcia tego samego wyniku jest użycie rozszerzonych nazw zamiast deklarowania i tworzenia XNamespace obiektu.

Takie podejście ma wpływ na wydajność. Za każdym razem, gdy przekazujesz ciąg zawierający rozszerzoną nazwę LINQ to XML, LINQ to XML musi przeanalizować nazwę, znaleźć atomyzowaną przestrzeń nazw i znaleźć nazwę atomizowaną. Ten proces zajmuje czas procesora CPU. Jeśli wydajność jest ważna, możesz zadeklarować obiekt i użyć go XNamespace jawnie.

Jeśli wydajność jest ważnym problemem, zobacz Pre-Atomization of XName Objects (Wstępne atomizacja obiektów XName), aby uzyskać więcej informacji.

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

Ten przykład generuje następujące wyniki:

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

Zobacz też