Ищете хороший синтаксический анализатор HTML, который предоставит значения, подобные offsetHeight

У меня есть проект, который требует от меня загрузки HTML-документа в виде строки и его анализа. Я пытаюсь определить, какой HTML-узел будет превышать высоту страницы (8,5x11), поэтому я могу вставить перед ним «разрыв страницы». Это будет сделано с помощью DLL .NET, которую я создаю.

Я попытался использовать mshtml dom. Загрузить сюда строковое значение непросто, и когда мне это удалось, свойства offsetHeight (и т. д.) всегда возвращают ноль. Единственный найденный мной способ сделать это — сохранить HTML на диск, загрузить его через SHDocVw.InternetExplorer, а затем передать его в mshtml dom.

Я предполагаю, что, если HTML не «рендерится» с помощью SHDocVw, у меня нет информации offsetHeight для mshtml, чтобы сообщить, так как это основано на пикселях экрана. Я могу ошибаться.

Мой текущий код выглядит следующим образом:

Dim myIE As New SHDocVw.InternetExplorer
myIE.Navigate("D:\Temp\Test.HTML")
Dim myDoc As mshtml.HTMLDocument = CType(myIE.Document, mshtml.HTMLDocument)

Dim divTag As mshtml.IHTMLElement = myDoc.getElementById("someID")

For Each childNode As mshtml.IHTMLElement In TryCast(divTag.children, mshtml.IHTMLElementCollection)
    If childNode.offsetTop + childNode.offsetHeight > 750 Then '72pixels = 1 inch.
         childNode.insertAdjacentHTML("beforeBegin", "<DIV style='page-break-after:always'></DIV>") 
    End If
Next

У меня две цели. №1 ключевой, №2 идеальный.

1) Загрузите HTML из строки, и приведенный выше код все еще будет работать.

2) В идеале найти компонент .NET, который будет делать то же самое. Мне не нравится полагаться на COM-компоненты в .NET, если только у меня нет выбора.


person Brett    schedule 26.02.2010    source источник


Ответы (2)


WebBrowser (возможно, не уверен) возьмет вашу HTML-строку и преобразует ее в навигационный DOM. Повторно используйте, не изобретайте парсер HTML. у вас останется больше волос в конце вашего проекта.

person No Refunds No Returns    schedule 26.02.2010
comment
Не уверен, что следую. WebBrowser — это класс windows.forms. У меня есть бесформенная .dll. Можешь так сделать? Я повозлюсь с этим, но мне любопытно, нет ли лучшего способа? - person Brett; 26.02.2010
comment
Ну что ты знаешь! Я добавил форму Windows с элементом управления веб-браузером, и он работает как шарм. Я не вижу, чтобы окно появлялось при вызове, так что это работает для меня! Спасибо! - person Brett; 26.02.2010
comment
Я использовал его в многочисленных модульных тестах пару лет назад. Не был уверен в классе, но рад, что это сработало. - person No Refunds No Returns; 27.02.2010

Используйте Html Agility Pack от Codeplex, который является самым тщательным синтаксическим анализатором HTML и создает дерево DOM на основе структуру HTML.

person t0mm13b    schedule 26.02.2010
comment
Я пробовал это. Отличный синтаксический анализатор, но, похоже, нет никаких позиционных свойств, чтобы сказать мне, где я нахожусь по отношению к странице. Это может быть streamPosition, но в документации не ясно, что это за значение. - person Brett; 26.02.2010
comment
Используйте типичную структуру, подобную XPath, чтобы получить путь к дочерним узлам, у которых есть элемент "someID"... - person t0mm13b; 26.02.2010
comment
Использовал его ... имеет некоторые недостатки, которые делают его непригодным для использования в некоторых ситуациях. Если ваш HTML сложный, я бы избегал этого. Работал нормально для простых страниц. - person No Refunds No Returns; 27.02.2010