Saya punya XDocument
objek. Saya ingin menanyakan elemen dengan nama tertentu di kedalaman apa pun menggunakan LINQ. Ketika saya gunakan Descendants("element_name")
, saya hanya mendapatkan elemen yang merupakan anak-anak langsung dari level saat ini. Apa yang saya cari sama dengan "// element_name" di XPath ... haruskah saya gunakan saja XPath
, atau adakah cara untuk melakukannya menggunakan metode LINQ? Terima kasih.
143
doc.Descendants("Cars").Descendants("Part")
(atau mungkin.Elements("Part")
jika mereka hanya anak-anak langsung.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
karenaDescendants
mengembalikan yang kosongIEnumerable<XElement>
dan tidaknull
.Contoh yang menunjukkan namespace:
sumber
Anda bisa melakukannya dengan cara ini:
dimana
xml
aXDocument
.Ketahuilah bahwa properti
Name
mengembalikan objek yang memiliki aLocalName
dan aNamespace
. Itu sebabnya Anda harus menggunakanName.LocalName
jika Anda ingin membandingkan dengan nama.sumber
Keturunan akan melakukan persis apa yang Anda butuhkan, tetapi pastikan bahwa Anda telah memasukkan nama namespace bersama dengan nama elemen. Jika Anda menghilangkannya, Anda mungkin akan mendapatkan daftar kosong.
sumber
Ada dua cara untuk mencapai ini,
Berikut ini adalah contoh penggunaan pendekatan ini,
Jika Anda menggunakan XPath, Anda perlu melakukan manipulasi dengan IEnumerable:
Catat itu
menghasilkan pointer nol, atau tanpa hasil.
sumber
XPathEvaluate
ada diSystem.Xml.XPath
namespace.Saya menggunakan
XPathSelectElements
metode ekstensi yang bekerja dengan cara yang sama denganXmlDocument.SelectNodes
metode:sumber
Mengikuti jawaban @Francisco Goldenstein, saya menulis metode ekstensi
sumber
kita tahu hal di atas benar. Jon tidak pernah salah; harapan kehidupan nyata bisa sedikit lebih jauh
Sebagai contoh, Biasanya masalahnya adalah, bagaimana kita bisa mendapatkan EchoToken dalam dokumen xml di atas? Atau cara mengaburkan elemen dengan nama attrbute.
1- Anda dapat menemukannya dengan mengakses dengan namespace dan nama seperti di bawah ini
2- Anda dapat menemukannya dengan nilai konten atribut, seperti ini
sumber
Ini varian saya dari solusi berdasarkan
Linq
dan metode KeturunanXDocument
kelasHasil:
Untuk detail lebih lanjut tentang
Desendants
metode ini lihat di sini.sumber
(Kode dan Instruksi adalah untuk C # dan mungkin perlu sedikit diubah untuk bahasa lain)
Contoh ini berfungsi sempurna jika Anda ingin membaca dari Parent Node yang memiliki banyak anak, misalnya lihat XML berikut;
Sekarang dengan kode di bawah ini (dengan mengingat bahwa File XML disimpan dalam sumber daya (Lihat tautan di akhir cuplikan untuk bantuan tentang sumber daya) Anda dapat memperoleh setiap alamat email dalam tag "email".
Hasil
Catatan: Untuk Aplikasi Konsol dan WPF atau Formulir Windows Anda harus menambahkan "using System.Xml.Linq;" Menggunakan arahan di bagian atas proyek Anda, untuk Konsol Anda juga perlu menambahkan referensi ke namespace ini sebelum menambahkan arahan Menggunakan. Juga untuk Konsol tidak akan ada file Resource secara default di bawah "Properties folder" sehingga Anda harus menambahkan file Resource secara manual. Artikel MSDN di bawah ini, jelaskan ini secara terperinci.
Menambah dan Mengedit Sumber Daya
Cara: Tambah atau Hapus Sumber Daya
sumber