da html a c # object, funzione ricorsiva?

c# dom html html-agility-pack object

Domanda

Sto provando a convertire un documento html in c # object. Ho un elenco di nomi di esempio in un elenco ordinato come di seguito. Sto usando Html Agility Pack.

<ol>
    <li>Heather</li>
    <li>Channing</li>
    <li>Briana</li>
    <li>Amber</li>
    <li>Sabrina</li>
    <li>Jessica
        <ol>
            <li>Melody</li>
            <li>Dakota</li>
            <li>Sierra</li>
            <li>Vandi</li>
            <li>Crystal</li>
            <li>Samantha</li>
            <li>Autumn</li>
            <li>Ruby</li>
        </ol></li>
    <li>Taylor</li>
    <li>Tara</li>
    <li>Tammy</li>
    <li>Laura</li>
    <li>Shelly</li>
    <li>Shantelle</li>
    <li>Bob and Alice
      <ol>
        <li>Courtney</li>
        <li>Misty</li>
        <li>Jenny</li>
        <li>Christa</li>
        <li>Mindy</li>
      </ol></li>
    <li>Noel</li>
    <li>Shelby</li>
</ol>

Questi sono gli oggetti che ho creato per rappresentare la lista dei nomi. Cioè le persone e i loro figli.

<ol>
    <li>Heather</li>
    <li>Channing</li>
    <li>Briana</li>
    <li>Amber</li>
    <li>Sabrina</li>
    <li>Jessica
        <ol>
            <li>Melody</li>
            <li>Dakota</li>
            <li>Sierra</li>
            <li>Vandi</li>
            <li>Crystal</li>
            <li>Samantha</li>
            <li>Autumn</li>
            <li>Ruby</li>
        </ol></li>
    <li>Taylor</li>
    <li>Tara</li>
    <li>Tammy</li>
    <li>Laura</li>
    <li>Shelly</li>
    <li>Shantelle</li>
    <li>Bob and Alice
      <ol>
        <li>Courtney</li>
        <li>Misty</li>
        <li>Jenny</li>
        <li>Christa</li>
        <li>Mindy</li>
      </ol></li>
    <li>Noel</li>
    <li>Shelby</li>
</ol>

Stavo pensando che per creare questi oggetti sarebbe meglio una funzione ricorsiva. Qualcuno può offrire qualche idea su come fare per convertire l'html in oggetti c #?

Abu.

Risposta accettata

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var list = Recurse(doc.DocumentNode);

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var list = Recurse(doc.DocumentNode);

Risposta popolare

Per divertimento - o nel caso in cui tu voglia veramente una lista di PeopleList che ha Persone con la loro PeopleList: p - potresti fare qualcosa di simile (non c'è bisogno di HtmlAgilityPack per il codice che hai postato):

namespace StackFun
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;

    public class PeopleList
    {
        public List<Person> People { get; set; }
    }

    public class Person
    {
        public string Name { get; set; }
        public PeopleList Children { get; set; }
    }

    class Program
    {
        static IEnumerable<PeopleList> GetChildren(PeopleList parent, IEnumerable<XElement> children)
        {
            parent.People = new List<Person>();
            foreach (var child in children)
            {
                var person = new Person
                {
                    Name = ((XText)child.FirstNode).Value.Trim(new[] { ' ', '\r', '\n' }),
                };
                parent.People.Add(person);
                foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromXml))
                {
                    person.Children = childrenOf;
                }
            }
            yield return parent;

        }

        static IEnumerable<PeopleList> BuildFromXml(XElement node)
        {
            return GetChildren(new PeopleList(), node.Elements("li"));
        }

        static void Main(string[] args)
        {
            const string xml = @"<ol>
            <li>Heather</li>
            <li>Channing</li>
            <li>Briana</li>
            <li>Amber</li>
            <li>Sabrina</li>
            <li>Jessica
                <ol>
                    <li>Melody</li>
                    <li>Dakota</li>
                    <li>Sierra</li>
                    <li>Vandi</li>
                    <li>Crystal</li>
                    <li>Samantha</li>
                    <li>Autumn</li>
                    <li>Ruby</li>
                </ol></li>
            <li>Taylor</li>
            <li>Tara</li>
            <li>Tammy</li>
            <li>Laura</li>
            <li>Shelly</li>
            <li>Shantelle</li>
            <li>Bob and Alice
              <ol>
                <li>Courtney</li>
                <li>Misty</li>
                <li>Jenny</li>
                <li>Christa</li>
                <li>Mindy</li>
              </ol></li>
            <li>Noel</li>
            <li>Shelby</li>
        </ol>";

            var doc = XDocument.Parse(xml);
            var listOfPeople = BuildFromXml(doc.Root).ToList();
        }
    }
}

Quello che probabilmente vorresti (supponendo che tu non abbia specificato) è un elenco di persone e dei loro figli che potresti ottenere usando:

namespace StackFun
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;

    public class PeopleList
    {
        public List<Person> People { get; set; }
    }

    public class Person
    {
        public string Name { get; set; }
        public PeopleList Children { get; set; }
    }

    class Program
    {
        static IEnumerable<PeopleList> GetChildren(PeopleList parent, IEnumerable<XElement> children)
        {
            parent.People = new List<Person>();
            foreach (var child in children)
            {
                var person = new Person
                {
                    Name = ((XText)child.FirstNode).Value.Trim(new[] { ' ', '\r', '\n' }),
                };
                parent.People.Add(person);
                foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromXml))
                {
                    person.Children = childrenOf;
                }
            }
            yield return parent;

        }

        static IEnumerable<PeopleList> BuildFromXml(XElement node)
        {
            return GetChildren(new PeopleList(), node.Elements("li"));
        }

        static void Main(string[] args)
        {
            const string xml = @"<ol>
            <li>Heather</li>
            <li>Channing</li>
            <li>Briana</li>
            <li>Amber</li>
            <li>Sabrina</li>
            <li>Jessica
                <ol>
                    <li>Melody</li>
                    <li>Dakota</li>
                    <li>Sierra</li>
                    <li>Vandi</li>
                    <li>Crystal</li>
                    <li>Samantha</li>
                    <li>Autumn</li>
                    <li>Ruby</li>
                </ol></li>
            <li>Taylor</li>
            <li>Tara</li>
            <li>Tammy</li>
            <li>Laura</li>
            <li>Shelly</li>
            <li>Shantelle</li>
            <li>Bob and Alice
              <ol>
                <li>Courtney</li>
                <li>Misty</li>
                <li>Jenny</li>
                <li>Christa</li>
                <li>Mindy</li>
              </ol></li>
            <li>Noel</li>
            <li>Shelby</li>
        </ol>";

            var doc = XDocument.Parse(xml);
            var listOfPeople = BuildFromXml(doc.Root).ToList();
        }
    }
}

E se vuoi (o hai bisogno) di usare HtmlAgilityPack, il codice potrebbe avere il seguente aspetto:

namespace StackFun
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;

    public class PeopleList
    {
        public List<Person> People { get; set; }
    }

    public class Person
    {
        public string Name { get; set; }
        public PeopleList Children { get; set; }
    }

    class Program
    {
        static IEnumerable<PeopleList> GetChildren(PeopleList parent, IEnumerable<XElement> children)
        {
            parent.People = new List<Person>();
            foreach (var child in children)
            {
                var person = new Person
                {
                    Name = ((XText)child.FirstNode).Value.Trim(new[] { ' ', '\r', '\n' }),
                };
                parent.People.Add(person);
                foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromXml))
                {
                    person.Children = childrenOf;
                }
            }
            yield return parent;

        }

        static IEnumerable<PeopleList> BuildFromXml(XElement node)
        {
            return GetChildren(new PeopleList(), node.Elements("li"));
        }

        static void Main(string[] args)
        {
            const string xml = @"<ol>
            <li>Heather</li>
            <li>Channing</li>
            <li>Briana</li>
            <li>Amber</li>
            <li>Sabrina</li>
            <li>Jessica
                <ol>
                    <li>Melody</li>
                    <li>Dakota</li>
                    <li>Sierra</li>
                    <li>Vandi</li>
                    <li>Crystal</li>
                    <li>Samantha</li>
                    <li>Autumn</li>
                    <li>Ruby</li>
                </ol></li>
            <li>Taylor</li>
            <li>Tara</li>
            <li>Tammy</li>
            <li>Laura</li>
            <li>Shelly</li>
            <li>Shantelle</li>
            <li>Bob and Alice
              <ol>
                <li>Courtney</li>
                <li>Misty</li>
                <li>Jenny</li>
                <li>Christa</li>
                <li>Mindy</li>
              </ol></li>
            <li>Noel</li>
            <li>Shelby</li>
        </ol>";

            var doc = XDocument.Parse(xml);
            var listOfPeople = BuildFromXml(doc.Root).ToList();
        }
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché