2010-02-26 2 views
1

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

Я попытался использовать 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, если у меня нет выбора.

ответ

0

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

+0

Не уверен, если я последую за ним. WebBrowser - это класс windows.forms. У меня есть formless .dll. Ты можешь сделать это? Я буду возиться с этим, но мне любопытно, нет ли лучшего способа? – Brett

+0

Хорошо, что ты знаешь! Я добавил форму окна с помощью элемента управления webbrowser, и он работает как шарм. Я не вижу, чтобы окно появлялось при вызове, поэтому это работает для меня! Благодаря! – Brett

+0

Я использовал его во многих модульных тестах coupla несколько лет назад. Не был уверен в классе, но рад, что это сработало. –

-1

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

+1

Я пробовал это. Отличный парсер, но, похоже, нет никаких позиционных свойств, чтобы сказать мне, где я нахожусь в отношении страницы. Возможно, StreamPosition это, но в документации не ясно, что это за значение. – Brett

+0

Используйте типичную структуру типа XPath, чтобы получить путь к дочерним узлам, который имеет элемент «someID» ... – t0mm13b

+0

Используется ... имеет некоторые недостатки, которые делают его непригодным для использования в некоторых ситуациях. Если ваш HTML-код сложный, я бы избегал этого. Работал нормально для простых страниц. –