html到c#对象,递归函数?
我正在尝试将html文档转换为c#对象。我有一个有序列表中的姓名示例列表,如下所示。我正在使用Html敏捷包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
<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();
}
}