Membuat pohon XML di C# (LINQ ke XML)

Artikel ini menyediakan informasi tentang membuat pohon XML di C#.

Untuk informasi tentang menggunakan hasil kueri LINQ sebagai konten untuk XElement, lihat Konstruksi Fungsional.

Membangun elemen

Tanda tangan XElement konstruktor dan XAttribute memungkinkan Anda meneruskan konten elemen atau atribut sebagai argumen ke konstruktor. Karena salah satu konstruktor mengambil jumlah variabel argumen, Anda dapat meneruskan sejumlah elemen turunan. Tentu saja, masing-masing elemen turunan tersebut dapat berisi elemen turunan mereka sendiri. Untuk setiap elemen, Anda dapat menambahkan sejumlah atribut.

Saat menambahkan XNode (termasuk XElement) atau XAttribute objek, jika konten baru tidak memiliki induk, objek hanya dilampirkan ke pohon XML. Jika konten baru sudah diindukkan, dan merupakan bagian dari pohon XML lain, konten baru dikloning, dan konten yang baru dikloning dilampirkan ke pohon XML. Contoh terakhir dalam artikel ini menunjukkan hal ini.

Untuk membuat contactsXElement, Anda dapat menggunakan kode berikut:

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

Jika diindentasi dengan benar, kode untuk membuat XElement objek sangat menyerupai struktur XML yang mendasarinya.

Konstruktor XElement

Kelas ini XElement menggunakan konstruktor berikut untuk konstruksi fungsional. Perhatikan bahwa ada beberapa konstruktor lain untuk XElement, tetapi karena mereka tidak digunakan untuk konstruksi fungsional mereka tidak tercantum di sini.

Konstruktor Deskripsi
XElement(XName name, object content) Membuat sebuah XElement. Parameter name menentukan nama elemen; content menentukan konten elemen.
XElement(XName name) Membuat XElement dengan yang XName diinisialisasi ke nama yang ditentukan.
XElement(XName name, params object[] content) Membuat XElement dengan yang XName diinisialisasi ke nama yang ditentukan. Atribut dan/atau elemen turunan dibuat dari konten daftar parameter.

Parameternya content sangat fleksibel. Ini mendukung semua jenis objek yang merupakan turunan yang valid dari XElement. Aturan berikut berlaku untuk berbagai jenis objek yang diteruskan dalam parameter ini:

  • String ditambahkan sebagai konten teks.
  • ditambahkan XElement sebagai elemen turunan.
  • ditambahkan XAttribute sebagai atribut.
  • , XProcessingInstructionXComment, atau XText ditambahkan sebagai konten turunan.
  • IEnumerable dijumlahkan, dan aturan ini diterapkan secara rekursif ke hasilnya.
  • Untuk jenis lain, metodenya ToString dipanggil dan hasilnya ditambahkan sebagai konten teks.

Contoh: Membuat XElement dengan konten

Anda dapat membuat XElement yang berisi konten sederhana dengan satu panggilan metode. Untuk melakukan ini, tentukan konten sebagai parameter kedua, sebagai berikut:

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

Contoh ini menghasilkan output berikut:

<Customer>Adventure Works</Customer>

Anda dapat meneruskan semua jenis objek sebagai konten. Misalnya, kode berikut membuat elemen yang berisi nomor titik mengambang sebagai konten:

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

Contoh ini menghasilkan output berikut:

<Cost>324.5</Cost>

Nomor titik mengambang dikotak dan diteruskan ke konstruktor. Nomor kotak dikonversi menjadi string dan digunakan sebagai konten elemen.

Contoh: Membuat XElement dengan elemen turunan

Jika Anda meneruskan instans XElement kelas untuk argumen konten, konstruktor membuat elemen dengan elemen turunan:

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

Contoh ini menghasilkan output berikut:

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

Contoh: Membuat XElement dengan beberapa elemen turunan

Anda dapat meneruskan sejumlah XElement objek untuk konten. Masing-masing XElement objek disertakan sebagai elemen anak.

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

Contoh ini menghasilkan output berikut:

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

Dengan memperluas contoh sebelumnya, Anda dapat membuat seluruh pohon XML, sebagai berikut:

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

Contoh ini menghasilkan output berikut:

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

Contoh: Membuat XElement dengan XAttribute

Jika Anda meneruskan instans XAttribute kelas untuk argumen konten, konstruktor membuat elemen dengan elemen turunan:

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

Contoh ini menghasilkan output berikut:

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

Contoh: Membuat elemen kosong

Untuk membuat kosong XElement, jangan meneruskan konten apa pun ke konstruktor. Contoh berikut membuat elemen kosong:

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

Contoh ini menghasilkan output berikut:

<Customer />

Contoh: Melampirkan vs. mengkloning

Seperti yang disebutkan sebelumnya, saat menambahkan XNode (termasuk XElement) atau XAttribute objek, jika konten baru tidak memiliki induk, objek hanya dilampirkan ke pohon XML. Jika konten baru sudah diindukkan, dan merupakan bagian dari pohon XML lain, konten baru dikloning, dan konten yang baru dikloning dilampirkan ke pohon XML.

Contoh berikut menunjukkan perilaku saat Anda menambahkan elemen induk ke pohon, dan saat Anda menambahkan elemen tanpa induk ke pohon:

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

Lihat juga