Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
html到c#对象,递归函数?_C#_Html_Dom_Object_Html Agility Pack - Fatal编程技术网

html到c#对象,递归函数?

html到c#对象,递归函数?,c#,html,dom,object,html-agility-pack,C#,Html,Dom,Object,Html Agility Pack,我正在尝试将html文档转换为c#对象。我有一个有序列表中的姓名示例列表,如下所示。我正在使用Html敏捷包 <ol> <li>Heather</li> <li>Channing</li> <li>Briana</li> <li>Amber</li> <li>Sabrina</li> <li>Jessica

我正在尝试将html文档转换为c#对象。我有一个有序列表中的姓名示例列表,如下所示。我正在使用Html敏捷包

<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>

  • 希瑟
  • 钱宁
  • 布丽安娜
  • 琥珀色
  • 萨布里娜
  • 杰西卡
  • 旋律
  • 达科他州
  • 塞拉
  • 范迪
  • 水晶
  • 萨曼莎
  • 红宝石
  • 泰勒
  • 塔拉
  • 塔米
  • 劳拉
  • 雪莉
  • 香特利
  • 鲍勃和爱丽丝
  • 考特尼
  • 薄雾
  • 珍妮
  • 克里斯塔
  • 明蒂
  • 诺埃尔
  • 谢尔比
  • 这些是我创建的用于表示名称列表的对象。即人们和他们的孩子

    public class PeopleList {
        public List<Person> People {get; set;}
    }
    
    public class Person {
        public string Name {get; set;}
        public PeopleList Children {get; set;}
    }
    
    公共类人员列表{
    公共列表人员{get;set;}
    }
    公共阶层人士{
    公共字符串名称{get;set;}
    公共人物列表子项{get;set;}
    }
    
    我在想,要创建这些对象,最好使用递归函数。有人能提供一些关于如何将html转换成c#对象的想法吗


    阿布。

    我会查看HTMLAgilityPack

    我没有专门为此使用它,但它在解析HTML时非常有效

    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    
    var list = Recurse(doc.DocumentNode);
    

    列表递归(HtmlAgilityPack.HtmlNode root)
    {
    var ol=根元素(“ol”);
    if(ol==null)返回null;
    返回ol.元素(“li”)
    .选择(li=>new Person
    {
    Name=li.FirstChild.InnerText.Trim(),
    子对象=递归(li)
    })
    .ToList();
    }
    
    为了好玩-或者如果你真的想要一个人物列表,其中有人和他们的人物列表:p-你可以这样做(你发布的代码不需要HtmlAgilityPack):

    namespace StackFun
    {
    使用System.Collections.Generic;
    使用System.Linq;
    使用System.Xml.Linq;
    公共阶层人士名单
    {
    公共列表人员{get;set;}
    }
    公共阶层人士
    {
    公共字符串名称{get;set;}
    公共人物列表子项{get;set;}
    }
    班级计划
    {
    静态IEnumerable GetChildren(PeopleList父级,IEnumerable子级)
    {
    parent.People=新列表();
    foreach(儿童中的儿童变量)
    {
    var person=新的人
    {
    Name=((XText)child.FirstNode.Value.Trim(新[]{'','\r','\n'}),
    };
    parent.People.Add(person);
    foreach(child.Elements(“ol”)中的var childrenOf.SelectMany(BuildFromXml))
    {
    person.Children=childrenOf;
    }
    }
    收益母公司;
    }
    静态IEnumerable BuildFromXml(XElement节点)
    {
    返回GetChildren(newpeopleList(),node.Elements(“li”);
    }
    静态void Main(字符串[]参数)
    {
    常量字符串xml=@“
    
  • 希瑟
  • 钱宁
  • 布丽安娜
  • 琥珀色
  • 萨布里娜
  • 杰西卡
  • 旋律
  • 达科他州
  • 塞拉
  • 范迪
  • 水晶
  • 萨曼莎
  • 红宝石
  • 泰勒
  • 塔拉
  • 塔米
  • 劳拉
  • 雪莉
  • 香特利
  • 鲍勃和爱丽丝
  • 考特尼
  • 薄雾
  • 珍妮
  • 克里斯塔
  • 明蒂
  • 诺埃尔
  • 谢尔比
  • "; var doc=XDocument.Parse(xml); var listOfPeople=BuildFromXml(doc.Root.ToList(); } } }
    不过,您可能想要的(猜测您尚未指定)是一份您可以使用的人员及其子女的列表:

    static IEnumerable<Person>Populate(IEnumerable<XElement> children)
    {
         foreach (var child in children)
         {
              var person = new Person
              {
                  Name = ((XText)child.FirstNode).Value.Trim(new[] { ' ', '\r', '\n' }),
                  Children = new PeopleList()
    
               };
               person.Children.People = new List<Person>();
               foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromXml))
               {
                   person.Children.People.Add(childrenOf);
               }
               yield return person;
         }
    
    }
    
    static IEnumerable<Person> BuildFromXml(XElement node)
    {
        return Populate(node.Elements("li"));
    }
    
    静态IEnumerablePopulate(IEnumerable子项)
    {
    foreach(儿童中的儿童变量)
    {
    var person=新的人
    {
    Name=((XText)child.FirstNode.Value.Trim(新[]{'','\r','\n'}),
    Children=新人物列表()
    };
    person.Children.People=新列表();
    foreach(child.Elements(“ol”)中的var childrenOf.SelectMany(BuildFromXml))
    {
    person.Children.People.Add(childrenOf);
    }
    收益人;
    }
    }
    静态IEnumerable BuildFromXml(XElement节点)
    {
    返回填充(节点元素(“li”);
    }
    
    如果您想要(或需要)使用HtmlAgilityPack,代码可能如下所示:

    class Program
    {
        static IEnumerable<Person> Populate(IEnumerable<HtmlNode> children)
        {
            foreach (var child in children)
            {
                var person = new Person
                {
                    Name = child.InnerText.Split(new char[] { '\r', '\n' })[0].Trim(),
                    Children = new PeopleList()
    
                };
                person.Children.People = new List<Person>();
                foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromHtml))
                {
                    person.Children.People.Add(childrenOf);
                }
                yield return person;
            }
    
    
        }
        static IEnumerable<Person> BuildFromHtml(HtmlNode node)
        {
            return Populate(node.Elements("li"));
        }
    
        static void Main(string[] args)
        {
            const string html = @"<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 = new HtmlDocument();
            doc.LoadHtml(html);
            var listOfPeople = BuildFromHtml(doc.DocumentNode.FirstChild).ToList();
        }
    }
    
    类程序
    {
    静态IEnumerable填充(IEnumerable子项)
    {
    foreach(儿童中的儿童变量)
    {
    var person=新的人
    {
    Name=child.InnerText.Split(新字符[]{'\r','\n'})[0].Trim(),
    Children=新人物列表()
    };
    person.Children.People=新列表();
    foreach(child.Elements(“ol”)中的var childrenOf.SelectMany(BuildFromHtml))
    {
    person.Children.People.Add(childrenOf);
    }
    收益人;
    }
    }
    静态IEnumerable BuildFromHtml(HtmlNode节点)
    {
    返回填充(节点元素(“li”);
    }
    静态void Main(字符串[]参数)
    {
    常量字符串html=@”
    
  • static IEnumerable<Person>Populate(IEnumerable<XElement> children)
    {
         foreach (var child in children)
         {
              var person = new Person
              {
                  Name = ((XText)child.FirstNode).Value.Trim(new[] { ' ', '\r', '\n' }),
                  Children = new PeopleList()
    
               };
               person.Children.People = new List<Person>();
               foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromXml))
               {
                   person.Children.People.Add(childrenOf);
               }
               yield return person;
         }
    
    }
    
    static IEnumerable<Person> BuildFromXml(XElement node)
    {
        return Populate(node.Elements("li"));
    }
    
    class Program
    {
        static IEnumerable<Person> Populate(IEnumerable<HtmlNode> children)
        {
            foreach (var child in children)
            {
                var person = new Person
                {
                    Name = child.InnerText.Split(new char[] { '\r', '\n' })[0].Trim(),
                    Children = new PeopleList()
    
                };
                person.Children.People = new List<Person>();
                foreach (var childrenOf in child.Elements("ol").SelectMany(BuildFromHtml))
                {
                    person.Children.People.Add(childrenOf);
                }
                yield return person;
            }
    
    
        }
        static IEnumerable<Person> BuildFromHtml(HtmlNode node)
        {
            return Populate(node.Elements("li"));
        }
    
        static void Main(string[] args)
        {
            const string html = @"<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 = new HtmlDocument();
            doc.LoadHtml(html);
            var listOfPeople = BuildFromHtml(doc.DocumentNode.FirstChild).ToList();
        }
    }