Tworzenie drzew XML w języku C# (LINQ to XML)

Ten artykuł zawiera informacje o tworzeniu drzew XML w języku C#.

Aby uzyskać informacje o korzystaniu z wyników zapytań LINQ jako zawartości elementu XElement, zobacz Konstrukcja funkcjonalna.

Konstruowanie elementów

Podpisy XElement konstruktorów i XAttribute umożliwiają przekazanie zawartości elementu lub atrybutu jako argumentów do konstruktora. Ponieważ jeden z konstruktorów przyjmuje zmienną liczbę argumentów, można przekazać dowolną liczbę elementów podrzędnych. Oczywiście każdy z tych elementów podrzędnych może zawierać własne elementy podrzędne. W przypadku dowolnego elementu można dodać dowolną liczbę atrybutów.

Podczas dodawania XNode (w tym XElement) lub XAttribute obiektów, jeśli nowa zawartość nie ma elementu nadrzędnego, obiekty są po prostu dołączone do drzewa XML. Jeśli nowa zawartość jest już nadrzędna i jest częścią innego drzewa XML, nowa zawartość jest klonowana, a nowo sklonowana zawartość jest dołączona do drzewa XML. Ostatni przykład w tym artykule pokazuje to.

Aby utworzyć element contactsXElement, możesz użyć następującego kodu:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

Jeśli wcięcie jest poprawne, kod do konstruowania XElement obiektów przypomina strukturę bazowego kodu XML.

Konstruktory XElement

Klasa XElement używa następujących konstruktorów do budowy funkcjonalnej. Należy pamiętać, że istnieją inne konstruktory dla XElementprogramu , ale ponieważ nie są one używane do budowy funkcjonalnej, nie są wymienione tutaj.

Konstruktor opis
XElement(XName name, object content) Tworzy element XElement. Parametr name określa nazwę elementu; content określa zawartość elementu.
XElement(XName name) Tworzy obiekt XElement z inicjowanym XName elementem o określonej nazwie.
XElement(XName name, params object[] content) Tworzy obiekt XElement z inicjowanym XName elementem o określonej nazwie. Atrybuty i/lub elementy podrzędne są tworzone na podstawie zawartości listy parametrów.

Parametr content jest niezwykle elastyczny. Obsługuje on dowolny typ obiektu, który jest prawidłowym elementem podrzędnym obiektu XElement. Następujące reguły dotyczą różnych typów obiektów przekazanych w tym parametrze:

  • Ciąg jest dodawany jako zawartość tekstowa.
  • Element XElement jest dodawany jako element podrzędny.
  • Element XAttribute jest dodawany jako atrybut.
  • Element XProcessingInstruction, XCommentlub XText jest dodawany jako zawartość podrzędna.
  • Element IEnumerable jest wyliczany, a te reguły są stosowane rekursywnie do wyników.
  • W przypadku dowolnego innego typu metoda ToString jest wywoływana, a wynik jest dodawany jako zawartość tekstowa.

Przykład: tworzenie elementu XElement z zawartością

Można utworzyć obiekt zawierający prostą XElement zawartość z jednym wywołaniem metody. W tym celu określ zawartość jako drugi parametr w następujący sposób:

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

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

<Customer>Adventure Works</Customer>

Jako zawartość można przekazać dowolny typ obiektu. Na przykład poniższy kod tworzy element zawierający liczbę zmiennoprzecinkową jako zawartość:

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

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

<Cost>324.5</Cost>

Liczba zmiennoprzecinkowa jest w polu i przekazywana do konstruktora. Liczba w polu jest konwertowana na ciąg i używana jako zawartość elementu.

Przykład: tworzenie elementu XElement z elementem podrzędnym

Jeśli przekażesz wystąpienie XElement klasy dla argumentu zawartości, konstruktor tworzy element z elementem podrzędnym:

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

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

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Przykład: tworzenie elementu XElement z wieloma elementami podrzędnymi

Możesz przekazać wiele XElement obiektów dla zawartości. Każdy z XElement obiektów jest dołączany jako element podrzędny.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

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

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

Rozszerzając poprzedni przykład, możesz utworzyć całe drzewo XML w następujący sposób:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

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

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Przykład: tworzenie elementu XElement za pomocą elementu XAttribute

Jeśli przekażesz wystąpienie XAttribute klasy dla argumentu zawartości, konstruktor utworzy element z atrybutem:

XElement phone = new XElement("Phone",
    new XAttribute("Type", "Home"),
    "555-555-5555");
Console.WriteLine(phone);

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

<Phone Type="Home">555-555-5555</Phone>

Przykład: Tworzenie pustego elementu

Aby utworzyć pusty XElementelement , nie przekazuj żadnej zawartości do konstruktora. Poniższy przykład tworzy pusty element:

XElement n = new XElement("Customer");
Console.WriteLine(n);

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

<Customer />

Przykład: Dołączanie a klonowanie

Jak wspomniano wcześniej, podczas dodawania XNode (w tym XElement) lub XAttribute obiektów, jeśli nowa zawartość nie ma elementu nadrzędnego, obiekty są po prostu dołączone do drzewa XML. Jeśli nowa zawartość jest już nadrzędna i jest częścią innego drzewa XML, nowa zawartość jest klonowana, a nowo sklonowana zawartość jest dołączona do drzewa XML.

W poniższym przykładzie pokazano zachowanie podczas dodawania elementu nadrzędnego do drzewa i dodawania elementu bez elementu nadrzędnego do drzewa:

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that's not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

// This example produces the following output:
//    Child1 was cloned
//    Child2 was attached

Zobacz też