এক্সএমএল পড়ার জন্য লিনকিউ


194

আমি এই এক্সএমএল ফাইলটি পেয়েছি:

<root>
    <level1 name="A">
        <level2 name="A1" />
        <level2 name="A2" />
    </level1>
    <level1 name="B">
        <level2 name="B1" />
        <level2 name="B2" />
    </level1>
    <level1 name="C" />
</root>

কেউ কি আমাকে লিনিকিউ ব্যবহার করে একটি সি # কোড দিতে পারে, এই ফলাফলটি মুদ্রণের সহজতম উপায়:
(অতিরিক্ত স্থানটি level2নোড হলে নোট করুন )

A
  A1
  A2
B
  B1
  B2
C

বর্তমানে আমি এই কোড পেয়েছি:

XDocument xdoc = XDocument.Load("data.xml"));
var lv1s = from lv1 in xdoc.Descendants("level1")
           select lv1.Attribute("name").Value;

foreach (var lv1 in lv1s)
{
    result.AppendLine(lv1);

    var lv2s = from lv2 in xdoc...???
}

উত্তর:


224

এটা চেষ্টা কর.

using System.Xml.Linq;

void Main()
{
    StringBuilder result = new StringBuilder();

    //Load xml
    XDocument xdoc = XDocument.Load("data.xml");

    //Run query
    var lv1s = from lv1 in xdoc.Descendants("level1")
               select new { 
                   Header = lv1.Attribute("name").Value,
                   Children = lv1.Descendants("level2")
               };

    //Loop through results
    foreach (var lv1 in lv1s){
            result.AppendLine(lv1.Header);
            foreach(var lv2 in lv1.Children)
                 result.AppendLine("     " + lv2.Attribute("name").Value);
    }

    Console.WriteLine(result);
}

3
: @bendewey আমি একটি অনুরূপ প্রশ্ন জিজ্ঞাসা আপনি কি দয়া করে এটা এখানে চেক করবে stackoverflow.com/questions/13247449/...
Saeid

2
এটি ঠিক মাছ ধরতে যেতে বিমানের ক্যারিয়ার নেওয়ার মতো।
TomeeNS

53

অথবা, আপনি যদি আরও সাধারণ পন্থা চান - যেমন "লেভেলএন" পর্যন্ত বাসা বাঁধার জন্য:

void Main()
{
    XElement rootElement = XElement.Load(@"c:\events\test.xml");

    Console.WriteLine(GetOutline(0, rootElement));  
}

private string GetOutline(int indentLevel, XElement element)
{
    StringBuilder result = new StringBuilder();

    if (element.Attribute("name") != null)
    {
        result = result.AppendLine(new string(' ', indentLevel * 2) + element.Attribute("name").Value);
    }

    foreach (XElement childElement in element.Elements())
    {
        result.Append(GetOutline(indentLevel + 1, childElement));
    }

    return result.ToString();
}

23

বেশ কয়েকটি পুরানো foreachলুপগুলি একটি পরিষ্কার সমাধান সরবরাহ করে:

foreach (XElement level1Element in XElement.Load("data.xml").Elements("level1"))
{
    result.AppendLine(level1Element.Attribute("name").Value);

    foreach (XElement level2Element in level1Element.Elements("level2"))
    {
        result.AppendLine("  " + level2Element.Attribute("name").Value);
    }
}

19

এখানে কয়েকটি পরিপূর্ণ কাজের উদাহরণ রয়েছে যা @ বেন্ডইউই এবং @ মডার উদাহরণগুলিতে তৈরি করে। এটির কাজ পেতে আমার প্রত্যেককে কিছুটা সামান্য টুইট করা দরকার, তবে অন্য কোনও লিনকু নুব কাজের উদাহরণ খুঁজে নিচ্ছে, আপনি এখানে যান:

//bendewey's example using data.xml from OP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

class loadXMLToLINQ1
{
    static void Main( )
    {
        //Load xml
        XDocument xdoc = XDocument.Load(@"c:\\data.xml"); //you'll have to edit your path

        //Run query
        var lv1s = from lv1 in xdoc.Descendants("level1")
           select new 
           { 
               Header = lv1.Attribute("name").Value,
               Children = lv1.Descendants("level2")
            };

        StringBuilder result = new StringBuilder(); //had to add this to make the result work
        //Loop through results
        foreach (var lv1 in lv1s)
        {
            result.AppendLine("  " + lv1.Header);
            foreach(var lv2 in lv1.Children)
            result.AppendLine("    " + lv2.Attribute("name").Value);
        }
        Console.WriteLine(result.ToString()); //added this so you could see the output on the console
    }
}

এবং পরবর্তী:

//Dommer's example, using data.xml from OP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

class loadXMLToLINQ
{
static void Main( )
    {
        XElement rootElement = XElement.Load(@"c:\\data.xml"); //you'll have to edit your path
        Console.WriteLine(GetOutline(0, rootElement));  
    }

static private string GetOutline(int indentLevel, XElement element)
    {
        StringBuilder result = new StringBuilder();
        if (element.Attribute("name") != null)
        {
            result = result.AppendLine(new string(' ', indentLevel * 2) + element.Attribute("name").Value);
        }
        foreach (XElement childElement in element.Elements())
        {
            result.Append(GetOutline(indentLevel + 1, childElement));
        }
        return result.ToString();
    }
}

এই দুটিই সিএসএস.এক্স.এক্স.ই.এস. সংস্করণ 4.0.30319.1 ব্যবহার করে ভিএস2010-এ সংকলন ও কাজ করে এবং ঠিক একই আউটপুট দেয়। আশা করি এইগুলি কোডের কার্যকারী উদাহরণগুলি খুঁজছেন এমন অন্য কাউকে সহায়তা করবে।

সম্পাদনা: @ ইগ্লাসিয়াসের উদাহরণ যুক্ত করা হয়েছে যেহেতু এটি আমার পক্ষে কার্যকর হয়েছিল:

//@eglasius example, still using data.xml from OP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

class loadXMLToLINQ2
{
    static void Main( )
    {
        StringBuilder result = new StringBuilder(); //needed for result below
        XDocument xdoc = XDocument.Load(@"c:\\deg\\data.xml"); //you'll have to edit your path
        var lv1s = xdoc.Root.Descendants("level1"); 
        var lvs = lv1s.SelectMany(l=>
             new string[]{ l.Attribute("name").Value }
             .Union(
                 l.Descendants("level2")
                 .Select(l2=>"   " + l2.Attribute("name").Value)
              )
            );
        foreach (var lv in lvs)
        {
           result.AppendLine(lv);
        }
        Console.WriteLine(result);//added this so you could see the result
    }
}

8
XDocument xdoc = XDocument.Load("data.xml");
var lv1s = xdoc.Root.Descendants("level1"); 
var lvs = lv1s.SelectMany(l=>
     new string[]{ l.Attribute("name").Value }
     .Union(
         l.Descendants("level2")
         .Select(l2=>"   " + l2.Attribute("name").Value)
      )
    );
foreach (var lv in lvs)
{
   result.AppendLine(lv);
}

পুনশ্চ. আপনাকে ব্যবহার করতে হবে .আর এই সংস্করণগুলির কোনওটিই রুট করুন।


এটি কি সমস্ত স্তর 1 এর পরে সমস্ত স্তরের 2 মুদ্রণ করে না?
sblom

@ এসপ্লোম ওফস, এটা ঠিক, আমি পোস্ট করার অর্থ দিয়ে তা আপডেট করেছিলাম (এর বিরুদ্ধে একটি পরীক্ষা চালিয়েছে, তাই আমি নিশ্চিত যে এটি এখন কাজ করে :))
এলাজাসিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.