HTML Linq с HtmlAgilityPack, или альтернативным, в PCL
Я написал проект на .NET 4, и в настоящее время я нахожусь в состоянии разрешить его запуск на Windows Phone. Я использую HtmlAgilityPack, хорошо известную библиотеку, которая позволяет запросы Linq по HTML, и я использую только интерфейсы LoadHtml и Linq, которые он предоставляет.
Преобразуя библиотеки классов из .NET 4 в PCL (Portable Class Library) с поддержкой .NET 4 и WP8, я больше не могу использовать библиотеку HtmlAgilityPack. Есть ли способ позволить HtmlAgilityPack правильно функционировать в рамках проекта PCL или есть альтернатива с аналогичным интерфейсом Linq, который работает по назначению?
EDIT: HtmlAgilityPack предоставляет 9 различных версий, ни один из которых не совместим с PCL. Ни один из них не разрешает зависимости от ссылок. Для некоторых версий может показаться, что это происходит, но при использовании ошибка будет вызвана с помощью обычной "не может загружать нерешенные зависимости".
РЕДАКТИРОВАТЬ № 2. Так как легко пропустить небольшой комментарий, я обновлю этот ответ с решением, которое я придумал. Я извлек то, что было необходимо для базовых функций, и реализовал недостающие компоненты, чтобы все работало. Результат здесь https://github.com/Deathspike/HtmlAgilityPack-PCL
Ответы
Ответ 1
Вы спросили и ответили на свой вопрос - не так ли?
HtmlAgilityPack не поддерживает использование портативных библиотек классов.
В лучшем случае вам нужно взглянуть на перенос/перенос требуемой вами конкретной функции, которая будет работать на платформах, которые вы используете.
Ответ 2
Один из вариантов заключается в переносе исходного кода HTML Agility Pack на PCL. Вы можете запустить PCL Compliance Analyzer, чтобы понять, насколько это будет сложно.
В качестве альтернативы используйте рисунок абстракции. Создайте портативный интерфейс для необходимой вам функциональности (т.е. LoadHtml
и Linq
), а затем реализуйте этот интерфейс для каждой платформы, вызывая в HTML Agility Pack. Тогда ваш переносимый код может зависеть от реализации конкретной платформы.
Для получения дополнительной информации см. это сообщение в блоге: Как сделать переносные библиотеки классов для вас
Ответ 3
Посмотрите HtmlParserSharp, это порт С# Validator.nu HTML5 парсер. Проект должен быть очень легким для создания в качестве библиотеки PCL, поскольку он более или менее прямой С++-порт и использует только самые базовые классы .NET Framework, с несколькими обновлениями для повышения производительности на С#.
В то время как большая часть работы, которую я сделал с HtmlParserSharp, была для CsQuery, что само по себе является долгим от совместимости с PCL, нет никаких оснований полагать, что HtmlParserSharp не будет работать отлично, если он будет использоваться как нежный HTML-парсер для ваших целей. Проект включает пример построения DOM на основе XmlElement
, но построитель дерева является абстракцией, поэтому вы можете легко изменить это, чтобы вместо этого использовать свои собственные объекты node.