Udostępnij za pośrednictwem


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 znajdujący się w przestrzeni nazw, należy najpierw zadeklarować i zainicjować obiekt XNamespace. Następnie użyj przeciążonego operatora dodawania, aby połączyć przestrzeń nazw z nazwą lokalną wyrażoną jako ciąg znaków.

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

W tym przykładzie są generowane następujące dane wyjściowe:

<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. 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 przestrzeni nazw Xmlns. Wartość tego atrybutu to identyfikator URI dla 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);

W tym przykładzie są generowane następujące dane wyjściowe:

<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 elemecie głównym, przestrzenie nazw są serializowane tak, aby http://www.adventure-works.com jest domyślną przestrzenią nazw, a 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 to domyślny URI przestrzeni nazw.

Jeśli domyślna deklaracja przestrzeni nazw jest w zakresie, ma zastosowanie do obiektów podrzędnych XElement poprzez dodanie prefiksu do ich nazw lokalnych przy użyciu odpowiedniego obiektu XNamespace. Z drugiej strony domyślne deklaracje przestrzeni nazw nie mają bezpośredniego zastosowania do nazw atrybutów. Dlatego XAttribute obiekty w domyślnej przestrzeni nazw są definiowane przez nie prefiksowania ich nazwy lokalnej z odpowiednim obiektem XNamespace.

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

W tym przykładzie są generowane następujące dane wyjściowe:

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

Przykład: Utwórz dokument, który ma dwie przestrzenie nazw, obie z prefiksami

Poniższy przykład tworzy dokument zawierający dwie przestrzenie nazw, obie 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);

W tym przykładzie są generowane następujące dane wyjściowe:

<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 obiektu XNamespace.

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 XNamespace i użyć go jawnie.

Jeśli wydajność jest istotnym zagadnieniem, zobacz Pre-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);

W tym przykładzie są generowane następujące dane wyjściowe:

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

Zobacz też