Я смотрел на подобные вопросы и искал он-лайн, но я не могу найти решение. То, что я пытаюсь сделать, это выбрать все элементы DOM по порядку (и т.д.), А затем поместить их в arraylist или что-то еще.
в настоящее время у меня есть
public void Parse()
{
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
// There are various options, set as needed
//htmlDoc.OptionFixNestedTags = true;
// filePath is a path to a file containing the html
htmlDoc.Load("Test.html");
// Use: htmlDoc.LoadHtml(xmlString); to load from a string (was htmlDoc.LoadXML(xmlString)
// ParseErrors is an ArrayList containing any errors from the Load statement
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
{
Console.WriteLine("There was an error parsing the HTML file");
}
else
{
if (htmlDoc.DocumentNode != null)
{
htmlDoc.DocumentNode.Descendants();
Console.WriteLine("document node not null");
//HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
{
Console.WriteLine(node.Name);
}
}
}
}
Код выводит имя узла (html, заголовок, изображение и т.д.), Но выводит закрывающие теги как "#text". Я предполагаю, что это происходит потому, что теги начинаются с "/". Как я могу получить правильное считывание всех элементов DOM?
"#text" - это имя текстовых узлов, а закрывающие теги не представлены как нечто уникальное в DOM.
<div><span>foo</span> bar</div>
Дает вам дерево, как
div
span
#text:foo
#text:bar
Я подозреваю, что элементы #text
которые вы видели, это разрывы строк, а не закрытие тега. Например, этот html-ввод:
<div>
<a href="http://example.org"></a>
</div>
используя ваш код будет выводить:
div
#text <- line break between <div> and <a>
a
#text <- line break between </a> and </div>
Вместо этого вы можете использовать этот запрос XPath, чтобы все элементы были не просто текстовым узлом (пропуская эти ненужные разрывы строк):
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*"))
{
Console.WriteLine(node.Name);
}
Это означает, что XPath означает, что все потоки текущего элемента имеют любое имя (*
).