Ich versuche, ein HTML-Dokument in c # -Objekt zu konvertieren. Ich habe eine Beispielliste von Namen in einer geordneten Liste wie unten. Ich verwende das 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>
Dies sind die Objekte, die ich erstellt habe, um die Namensliste darzustellen. Dh Menschen und ihre Kinder.
public class PeopleList {
public List<Person> People {get; set;}
}
public class Person {
public string Name {get; set;}
public PeopleList Children {get; set;}
}
Ich dachte, dass zum Erstellen dieser Objekte eine rekursive Funktion am besten wäre. Kann jemand irgendwelche Ideen anbieten, wie man das HTML in c # Objekte umwandelt?
Abu.
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var list = Recurse(doc.DocumentNode);
List<Person> Recurse(HtmlAgilityPack.HtmlNode root)
{
var ol = root.Element("ol");
if (ol == null) return null;
return ol.Elements("li")
.Select(li => new Person
{
Name = li.FirstChild.InnerText.Trim(),
Children = Recurse(li)
})
.ToList();
}
Zum Spaß - oder falls Sie wirklich eine Liste von PeopleList haben wollen, die Personen mit ihrer PeopleList hat: p - Sie könnten etwas tun wie (Sie brauchen HtmlAgilityPack für den von Ihnen geposteten Code nicht):
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();
}
}
}
Was Sie aber wahrscheinlich wollen (Sie haben nicht angegeben) ist eine Liste von Personen und deren Kindern, die Sie verwenden können:
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"));
}
Und wenn Sie HtmlAgilityPack verwenden möchten (oder müssen), könnte der Code wie folgt aussehen:
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();
}
}