Преобразование строки или HTML-файла в C # HtmlDocument без использования WebBrowser или HAP - PullRequest
3 голосов
/ 20 февраля 2012

Единственное решение, которое я смог найти, это использовать:

            mshtml.HTMLDocument htmldocu = new mshtml.HTMLDocument();
            htmldocu .createDocumentFromUrl(url, "");

и я не уверен насчет производительности, это должно быть лучше, чем загрузка html-файла в WebBrowser и затем захватывание HtmlDocument оттуда Во всяком случае, этот код не работает на моей машине. Приложение вылетает при попытке выполнить вторую строку.

Есть ли у кого-нибудь подход для достижения этого эффективно или каким-либо другим способом?

ПРИМЕЧАНИЕ: пожалуйста, поймите, что мне нужен объект HtmlDocument для обработки DOM. Мне не нужна строка HTML.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Используйте метод DownloadString объекта WebClient.например,

WebClient client = new WebClient();
string reply = client.DownloadString("http://www.google.com");

В приведенном выше примере после выполнения reply будет содержать html-разметку конечной точки http://www.google.com.

WebClient.DownloadString MSDN

0 голосов
/ 19 сентября 2016

В попытке ответить на ваш актуальный вопрос четыре года назад (на момент публикации этого ответа) я предоставляю рабочее решение. Я не удивлюсь, если вы найдете другой способ сделать это, так что это в основном для других людей, которые ищут подобное решение. Имейте в виду, однако, что это считается

  1. несколько устарел (фактическое использование HtmlDocument)
  2. не самый лучший способ обработки HTML DOM (предпочтительное решение - использовать HtmlAgilityPack или CsQuery или какой-либо другой метод с использованием фактического анализа, а не регулярных выражений)
  3. чрезвычайно хакерский и, следовательно, не самый безопасный / самый совместимый способ сделать это
  4. Вы действительно не должны делать то, что я собираюсь показать

Кроме того, имейте в виду, что HtmlDocument на самом деле является просто оболочкой для mshtml.HTMLDocument2, поэтому она технически на медленнее, чем просто использование COM-оболочки напрямую, но я полностью понимаю вариант использования просто для простота кодирования.

Если вы круты со всем вышеперечисленным, вот как выполнить то, что вы хотите.

public class HtmlDocumentFactory
{
  private static Type htmlDocType = typeof(System.Windows.Forms.HtmlDocument);
  private static Type htmlShimManagerType = null;
  private static object htmlShimSingleton = null;
  private static ConstructorInfo docCtor = null;

  public static HtmlDocument Create()
  {
    if (htmlShimManagerType == null)
    {
      // get a type reference to HtmlShimManager
      htmlShimManagerType = htmlDocType.Assembly.GetType(
        "System.Windows.Forms.HtmlShimManager"
        );
      // locate the necessary private constructor for HtmlShimManager
      var shimCtor = htmlShimManagerType.GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null
        );
      // create a new HtmlShimManager object and keep it for the rest of the
      // assembly instance
      htmlShimSingleton = shimCtor.Invoke(null);
    }

    if (docCtor == null)
    {
      // get the only constructor for HtmlDocument (which is marked as private)
      docCtor = htmlDocType.GetConstructors(
        BindingFlags.NonPublic | BindingFlags.Instance
        )[0];
    }

    // create an instance of mshtml.HTMLDocument2 (in the form of 
    // IHTMLDocument2 using HTMLDocument2's class ID)
    object htmlDoc2Inst = Activator.CreateInstance(Type.GetTypeFromCLSID(
      new Guid("25336920-03F9-11CF-8FD0-00AA00686F13")
      ));
    var argValues = new object[] { htmlShimSingleton, htmlDoc2Inst };
    // create a new HtmlDocument without involving WebBrowser
    return (HtmlDocument)docCtor.Invoke(argValues);
  }
}

Чтобы использовать это:

var htmlDoc = HtmlDocumentFactory.Create();
htmlDoc.Write("<html><body><div>Hello, world!</body></div></html>");
Console.WriteLine(htmlDoc.Body.InnerText);
// output:
// Hello, world!

Я не тестировал этот код напрямую - я перевел его из старого скрипта Powershell, который нуждался в той же функциональности, которую вы запрашивали. Если не получится, дайте мне знать. Функциональность есть, но для работы кода может потребоваться небольшая настройка.

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