Я пытаюсь получить «NAME» и «E-MAIL» тексты из следующего HTML-файла:Как получить внутренний текст из XML-документа с помощью XDocument и расширения методов
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<ol>
<li>
<font class="normal">
<b>NAME</b> <a href="/member/mail_compose.aspx?id=name"><img src="/images/mailbox.gif" border="0" alt="Send Mail" /></a> <a href="/photos/member_viewphoto.aspx?id=name"><img src="/images/icons/member_photos.gif" border="0" alt="View Photos" /></a> <br />
ADDRESS<br />
PHONE<br />
<a href="mailto:[email protected]" class="redlink">EMAIL</a><br />
<br />
</font>
</li>
</body>
</html>
Вот код, который Я использую:
// Load the xml document
XDocument xDoc = XDocument.Load(@"..\..\Directory.html");
// Parse document
var names = xDoc.Root.DescendantsAndSelf()
.Where(x => x.Name.LocalName == "ol").DescendantsAndSelf()
.Where(x => x.Name.LocalName == "li").DescendantsAndSelf()
.Select(x => new
{
name = x.Elements().Where(y => y.Name.LocalName == "b").Select(y => y.Value),
email = x.DescendantsAndSelf().Where(y => y.Name.LocalName == "a" && x.FirstAttribute.Name == "href" && x.Attribute("href").Value.Contains("mailto")).Select(y => y.Value ?? "No Email")
}
);
// Print text to console
for (int i = 0; i < names.Count(); i++)
{
Console.WriteLine("{0}: {1}", names.ElementAt(i).name, names.ElementAt(i).email);
}
Каким-то образом, приведенный выше код печатает это:
System.Linq.Enumerable + WhereSelectEnumerableIterator
2[System.Xml.Linq.XElement, System.String]: System.Linq.Enumerable+WhereSelectEnumerableIterator
2 [System.Xm l.Linq.XElement, System.String]
Может кто-то пожалуйста, скажите мне, почему это происходит? Кроме того, если есть лучший способ сделать это, предложения будут очень желанными.
Этот ответ также работает, но я отмечаю другой правильный ответ как ответ, потому что он был опубликован первым. Спасибо за ваш ответ. – Tom