Pilih node tertentu dalam XML dengan LINQ

Saya sedang menulis fungsi yang memuat dokumen XML dan mengubahnya menjadi CSV. Karena saya hanya memerlukan beberapa nilai dari file XML, tujuan yang ingin saya capai adalah memilih hanya node yang saya minati.

Ini kode saya:

      XDocument csvDocument = XDocument.Load(tempOutput);

        StringBuilder csvBuilder = new StringBuilder(1000);

        foreach (XElement node in csvDocument.Descendants("Sample"))
        {
            foreach (XElement innerNode in node.Elements())
            {
                        csvBuilder.AppendFormat("{0},", innerNode.Value);
                    }

                    csvBuilder.Remove(csvBuilder.Length -1, 1);

                    csvBuilder.AppendLine();
                }
                csvOut = csvBuilder.ToString();

Namun, dengan cara ini saya memilih SEMUA node anak di dalam node "Sampel".

Dalam XML, pohon "Sampel" adalah:

<Sample Type="Object" Class ="Sample">
    <ID>1</ID>
    <Name>10096</Name>
    <Type>2</Type>
    <Rep>0</Rep>
    <Selected>True</Selected>
    <Position>1</Position>
    <Pattern>0</Pattern>
   </Sample>

Kode berfungsi dengan sempurna, tetapi saya hanya perlu "ID" dan "Terpilih" untuk dipilih dan nilainya ditulis di dalam file CSV.

Adakah yang bisa mengarahkan saya ke arah yang benar?

Terima kasih.


person user1776401    schedule 30.03.2013    source sumber
comment
Jadi apa yang ingin Anda lakukan, {ID},{Name}, dan seterusnya untuk setiap objek Sampel?   -  person It'sNotALie.    schedule 31.03.2013


Jawaban (1)


Pelajari lebih lanjut tentang Linq-to-xml di sini. Anda tidak benar-benar memanfaatkan 'kebingungan' XObjects

var samples = csvDocument.Descendants("Sample")
                         .Select(el => new {
                             Id = el.Element("ID").Value,
                             Selected = el.Elemnt("Selected").Value
                         });

Ini akan membuatkan Anda IEnumerable<T> dengan 'T' adalah tipe anonim dengan properti Id dan Selected. Anda dapat mengurai (int.Parse atau bool.Parse) nilai Id dan Selected untuk keamanan jenis. Tapi karena Anda hanya menulis ke objek StringBuilder Anda mungkin tidak peduli ...hanya sekedar FYI.

Objek StringBuilder kemudian dapat ditulis sebagai berikut:

foreach (var sample in samples) {
    csvBuilder.AppendFormat(myFormattedString, sample.Id, sample.Selected);
}

Peringatannya adalah objek anonim Anda dan loop for-each harus berada dalam cakupan yang sama. Namun ada cara untuk menyiasatinya jika diperlukan.

Seperti biasa, ada lebih dari satu cara menguliti kucing.

Perbarui ...dalam referensi. berkomentar:

foreach (XElement node in csvDocument.Descendants("Sample"))
{
    foreach (XElement innerNode in node.Elements())
    {
        //    this logic assumes different formatting for values
        //    otherwise, change if statement to || each comparison
        if(innerNode.Name == "ID") {
            // append/format stringBuilder
            continue;
        }

        if(innerNode.Name == "Selected") {
            // append/format stringBuilder
            continue;
        }
    }

    csvBuilder.Remove(csvBuilder.Length -1, 1);

    csvBuilder.AppendLine();
}
person IAbstract    schedule 30.03.2013
comment
Tentu saya harus mencoba cara ini juga. Tapi saya ingin menggunakan cara yang sudah saya kodekan. Seharusnya ada cara untuk mengedit: foreach (XElement innerNode di node.Elements()) menambahkan beberapa aturan untuk melewati elemen yang tidak diinginkan atau hanya mengambil elemen yang saya inginkan. - person user1776401; 31.03.2013
comment
Di foreach Anda, periksa nama innerNode dan jika bukan ID atau Selected lewati saja? Atau apakah saya melewatkan sesuatu? - person Pete; 31.03.2013
comment
Terima kasih IAbstrak! Kode Anda berfungsi! Sebelumnya saya mencoba menambahkan innerNode.Name ke pernyataan foreach tetapi itu memberi saya kesalahan! Terima kasih lagi. Ngomong-ngomong, Pete, saya juga mencoba cara itu, menambahkan properti Skip ke pernyataan foreach tetapi saya harus melakukan kesalahan karena tidak berhasil. Bisakah Anda memposting contoh kerja? - person user1776401; 31.03.2013