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

3

I have 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 its distinct books using Linq ?

    
asked by anonymous 31.01.2014 / 19:44

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

*/
    
01.02.2014 / 03:29
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 distinguished result will return in the List<> livros

    
31.01.2014 / 20:18