What is the simplest way to recover certain elements of an XML with Linq?

Asked

Viewed 408 times

3

I got the following XML:

<clientes>
    <cliente>
        <documentos/>
        <livros>
            <livro nome="Nome1"/>
            <livro nome="Nome2"/>
        </livros>
    </cliente>
    <cliente>
        <documentos/>
        <livros>
            <livro nome="Nome1"/>
            <livro nome="Nome3"/>
        </livros>
    </cliente>
</clientes>

How do I retrieve a list of all of his distinct books using Linq?

2 answers

6


Try the following:

var s = @"<clientes>
    <cliente>
        <documentos/>
        <livros>
            <livro nome=""Nome1""/>
            <livro nome=""Nome2""/>
        </livros>
    </cliente>
    <cliente>
        <documentos/>
        <livros>
            <livro nome=""Nome1""/>
            <livro nome=""Nome3""/>
        </livros>
    </cliente>
</clientes>";

var doc = XDocument.Parse(s);

var livros = doc.Descendants("livro")
                .Select(_=>_.Attribute("nome").Value)
                .Distinct()
                .ToList();

/* 'livros' contem:

Nome1
Nome2
Nome3

*/
  • I liked its implementation, but it would not be the case to call the method Attribute instead of Attributes and then the First?

  • Very well observed. I changed the example as suggested.

  • It was very simple, "one line only".

2

Use:

var clientes = System.Xml.Linq.XDocument.Load(@"C:\TEMP\arquivo.xml");

var livros = new List<string>();

foreach (var cliente in clientes.Root.Elements())
{
    foreach (var livrosEdocumentos in cliente.Elements())
    {
        if (livrosEdocumentos.Name == "livros")
        {
            foreach (var livro in livrosEdocumentos.Elements())
            {
                var lv = (from l in livros
                          where l == livro.FirstAttribute.Value
                          select l).FirstOrDefault();

                if (lv == null)
                {
                    livros.Add(livro.FirstAttribute.Value);
                }
            }
        }
    }
}

Put your XML in the.xml file.'.

The distinct result will return in the list List<> livros

Browser other questions tagged

You are not signed in. Login or sign up in order to post.