Html Agility Pack не соответствует тегам <link> - PullRequest
1 голос
/ 16 января 2011

Код: (с использованием HTML Agility Pack)

 Dim moHtmlParser As HtmlDocument = New HtmlDocument           
 moHtmlParser.LoadHtml(htmlString)

 Dim maStyles As New List(Of String)
 Dim moStyleNodes As HtmlNodeCollection = moHtmlParser.DocumentNode.SelectNodes("//link")

Html:

<head runat="server">
<script src="Scripts/JScript1.js" type="text/javascript" ></script>

<link href="Stylesheets/StyleSheet1.css" rel="Stylesheet" type="text/css" />

<link href="Stylesheets/StyleSheet2.css" rel="Stylesheet" type="text/css" />

<link href="Stylesheets/StyleSheet3.css" rel="Stylesheet" type="text/css" />    


<title>Untitled Page</title>

Нет совпадений? moStyleMatches - это всегда Ничто. Показанный HTML от Главы, для чего это стоит. Я могу сопоставить другие теги (скрипт, заголовок) без проблем.

Обновление:

Даже после удаления ElementsFlag для тегов «link» он просто не будет брать теги.

Я работал с этим кодом:

Dim moStyleNodes As HtmlNodeCollection = moHtmlParser.DocumentNode.SelectNodes("//*[@rel]")

Затем я позаботился о том, чтобы «rel» был «таблицей стилей», прежде чем работать с узлом.

Пока работает, но не объясняет, почему он вообще не работал.

Ответы [ 2 ]

1 голос
/ 17 января 2011

Скорее всего, это проблема пространства имен по умолчанию - скорее всего, это пространство имен по умолчанию в полном документе, которое вы не показали.

Написание выражений XPath, адресованных именамкоторые не находятся в пространстве имен - это часто задаваемые вопросы , и в теге xpath есть много хороших ответов - просто найдите и прочитайте их.

В итоге , XPath считает все без префиксаимя в выражении XPath, которое должно быть в "no namespace".Поскольку фактические элементы в документе XML находятся в в пространстве имен по умолчанию (а не в пространстве имен), они не выбраны.

Решение состоит в том, чтобы зарегистрировать привязку пространства имен с использованием API вашего механизма XPath, а затем префиксировать все имена в выражении с префиксом из привязки.

См. this для получения дополнительной информации , как именно зарегистрировать пространство имен в SimpleXML.

0 голосов
/ 17 января 2011

Даже после удаления ElementsFlag для тегов «link», он просто не будет брать теги.

Я работал с этим кодом:

Dim moStyleNodes As HtmlNodeCollection = moHtmlParser.DocumentNode.SelectNodes("//*[@rel]")

Затем я убедился, что "rel" был "таблицей стилей", прежде чем работать с узлом.

Пока работает, но не объясняет, почему это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...