LINQ для чтения XML-файла и печати результатов - PullRequest
0 голосов
/ 28 декабря 2011

Я получил следующий XML-файл (Data.xml):

<root>
 <sitecollection name="1A">
   <site name="1B">
     <maingroup name="1C"> 
        <group name="1D"> </group>
     </maingroup> 
    </site>
 </sitecollection>
 <sitecollection name="2A">
   <site name="2B">
     <maingroup name="2C"> 
        <group name="2D"> </group>
     </maingroup> 
    </site>
 </sitecollection>
</root>

И мне нужно распечатать все дочерние элементы в этом формате:

1A
 1B
  1C
   1D
2A
 2B
  2C
   2D

Пока у меня есть следующий код, который нуждается в некоторой настройке. Я мог бы также полностью изменить его, если есть более простой метод. Спасибо за вашу помощь

class xmlreader
{
    public static void Main()
    {

        // Xdocument to read XML file
        XDocument xdoc = XDocument.Load("Data.xml");
        var result = new System.Text.StringBuilder();

        var lv1s = from lv1 in xdoc.Descendants("sitecollection")
                   select new
                   {
                       sitecollection = lv1.Attribute("name").Value,
                       maingroup = lv1.Descendants("group")

                   };
        var lv2s = from lv2 in xdoc.Descendants("site")
                   select new
                   {
                       site = lv2.Attribute("name").Value,
                       sitetittle = lv2.Descendants()
                   };
        var lv3s = from lv3 in xdoc.Descendants("maingroup")
                   select new
                   {
                       maingroup = lv3.Attribute("name").Value,
                   };
        var lv4s = from lv4 in xdoc.Descendants("group")
                   select new
                   {
                       grouppage = lv4.Attribute("name").Value,
                   };


        // Loop to print results
        foreach (var lv1 in lv1s)
        {
            result.AppendLine(lv1.sitecollection);
            foreach (var lv2 in lv2s)
            {
                result.AppendLine("   " + lv2.Attribute("name").Value);

                foreach (var lv3 in lv3s)
                {
                    result.AppendLine("   " + lv3.Attribute("name").Value);

                    foreach (var lv4 in lv4s)
                    {
                        result.AppendLine("   " + lv4.Attribute("name").Value);
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

При такой однородной иерархии рекурсия может выполнять работу с гораздо меньшим количеством кода:

    void PrintNames(StringBuilder result, string indent, XElement el)
    {
        var attr = el.Attributes("name");
        if (attr != null)
        {
            result.Append(indent);
            result.Append(attr.Value);
            result.Append(System.Environment.NewLine);
        }
        indent = indent + " ";
        foreach(var child in el.Elements())
        {
            PrintNames(result, indent, child);
        }
    }

...

var sb = new StringBuilder();
PrintNames(sb, String.Empty, xdoc.Root);
0 голосов
/ 28 декабря 2011

Как насчет следующего, найти все элементы с атрибутом имени, а затем добавить пробелы в зависимости от их глубины.

var result = new System.Text.StringBuilder();
var namedElements = doc.Descendants().Where(el => el.Attributes("name")!=null);
foreach(var el in namedElements)
{
  int depth = el.Ancestors().Count();
  for (int i=0;i<depth;i++)
    result.Append(" "); 

  result.Append(el.Attributes("name").Value);
  result.Append(System.Environment.NewLine);
}

ПРИМЕЧАНИЕ. Выше приведено по памяти, поэтому, пожалуйста, проверьте синтаксис!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...