Névterekkel rendelkező dokumentum létrehozása C# nyelven (LINQ–XML)

Ez a cikk bemutatja, hogyan hozhat létre névterekkel rendelkező C#-dokumentumokat.

Példa: Alapértelmezett névtér deklarálása és inicializálása

Ha névtérben lévő elemet vagy attribútumot szeretne létrehozni, először deklaráljon és inicializáljon egy XNamespace objektumot. Ezután az összeadási operátor túlterhelésével kombinálja a névteret a helyi névvel, sztringként kifejezve.

Az alábbi példa egy egy névtérrel rendelkező dokumentumot hoz létre. Alapértelmezés szerint a LINQ–XML szerializálja ezt a dokumentumot egy alapértelmezett névtérrel.

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

Ez a példa a következő kimenetet hozza létre:

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

Példa: Névtérrel és attribútummal rendelkező dokumentum létrehozása

Az alábbi példa egy egy névtérrel rendelkező dokumentumot hoz létre. Létrehoz egy attribútumot is, amely névtérelőtaggal deklarálja a névteret. Ha olyan attribútumot szeretne létrehozni, amely egy előtaggal rendelkező névteret deklarál, hozzon létre egy attribútumot, amelyben az attribútum neve a névtér előtagja, és ez a név a Xmlns névtérben található. Ennek az attribútumnak az értéke a névtér URI-ja.

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

Ez a példa a következő kimenetet hozza létre:

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

Példa: Két névtérrel rendelkező dokumentum létrehozása egy előtaggal

Az alábbi példa egy két névteret tartalmazó dokumentum létrehozását mutatja be. Az egyik az alapértelmezett névtér, a másik egy előtaggal rendelkező névtér.

A névtérattribútumok gyökérelembe való beépítésével a névterek szerializálva lesznek, hogy a http://www.adventure-works.com legyen az alapértelmezett névtér, a www.fourthcoffee.com pedig fcelőtaggal szerializálva legyen. Ha egy alapértelmezett névteret deklaráló attribútumot szeretne létrehozni, hozzon létre egy xmlnsnevű attribútumot névtér nélkül. Az attribútum értéke az alapértelmezett névtér URI-ja.

Ha egy alapértelmezett névtér-deklaráció hatókörben van, akkor a megfelelő XNamespace objektummal előtagolja a gyermek XElement objektumok helyi nevét. Másrészt az alapértelmezett névtér-deklarációk nem vonatkoznak közvetlenül az attribútumnevekre. Az alapértelmezett névtérben lévő XAttribute objektumokat a úgy definiálja, hogy a helyi nevüket nem a előtaggal, hanem a megfelelő XNamespace objektummal látja el.

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

Ez a példa a következő kimenetet hozza létre:

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

Példa: Két névtérrel rendelkező dokumentum létrehozása, mindkettő előtaggal

Az alábbi példa egy olyan dokumentumot hoz létre, amely két névteret tartalmaz, mindkettő névtér-előtagokkal.

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

Ez a példa a következő kimenetet hozza létre:

<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élda: Névtér létrehozása kibontott nevek használatával

Ugyanezt az eredményt úgy is végrehajthatja, ha kibontott neveket használ ahelyett, hogy deklarál és létrehoz egy XNamespace objektumot.

Ez a megközelítés teljesítménybeli következményekkel jár. Minden alkalommal, amikor kibontott nevet tartalmazó sztringet ad át a LINQ-nak az XML-nek, a LINQ-nek XML-nek elemeznie kell a nevet, meg kell keresnie az atomizált névteret, és meg kell keresnie az atomizált nevet. Ez a folyamat processzoridőt igényel. Ha a teljesítmény fontos, érdemes lehet explicit módon deklarálni és használni egy XNamespace objektumot.

Ha a teljesítmény fontos probléma, további információt XName-objektumok előzetes atomizálása című témakörben talál.

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

Ez a példa a következő kimenetet hozza létre:

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

Lásd még: