Как переписать поток токенов HTML в новый документ? - PullRequest
2 голосов
/ 21 февраля 2010

Предположим, у меня есть HTML-документ, который я токенизировал, как я могу преобразовать его в новый документ или применить некоторые другие преобразования?

Например, предположим, у меня есть этот HTML:

<html>
 <body>
  <p><a href="/foo">text</a></p>
  <p>Hello <span class="green">world</span></p>
 </body>
</html>

То, что я сейчас написал, - это токенизатор, который выводит поток токенов. Для этого документа они будут (написаны в псевдокоде):

TAG_OPEN[html] TAG_OPEN[body] TAG_OPEN[p] TAG_OPEN[a] TAG_ATTRIBUTE[href]
TAG_ATTRIBUTE_VALUE[/foo] TEXT[text] TAG_CLOSE[a] TAG_CLOSE[p]
TAG_OPEN[p] TEXT[Hello] TAG_OPEN[span] TAG_ATTRIBUTE[class]
TAG_ATTRIBUTE_VALUE[green] TEXT[world] TAG_CLOSE[span] TAG_CLOSE[p]
TAG_CLOSE[body] TAG_CLOSE[html]

Но теперь я понятия не имею, как я могу использовать этот поток для создания некоторых преобразований.

Например, я хотел бы переписать TAG_ATTRIBUTE_VALUE[/foo] в TAG_OPEN[a] TAG_ATTRIBUTE[href] на что-то другое.

Еще одно преобразование, которое я хотел бы сделать, - вывести атрибуты TAG_ATTRIBUTE[href] после TAG_OPEN[a] в скобках, например,

<a href="/foo">text</a>

переписывается в

<a href="/foo">text</a>(/foo)

Какова общая стратегия таких преобразований? Я хотел бы сделать много других преобразований, таких как удаление всех тегов и просто оставить текстовое содержимое, добавить теги после некоторых определенных тегов и т. Д.

Нужно ли создавать дерево разбора? Я никогда не делал этого и не знаю, как создать дерево разбора из потока токенов. Или я могу сделать это как-нибудь еще?

Любые предложения приветствуются.

И еще одно - я бы хотел научиться всему этому самому анализу, поэтому я не ищу библиотеку!

Заранее спасибо, Бода Цидо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2010

Существуют различные способы анализа / обхода дерева XML / HTML. Возможно, я могу указать вам: -

http://razorsharpcode.blogspot.com/2009/10/combined-pre-order-and-post-order-non.html

Если вы хотите сделать предзаказ или постзаказ манипуляции с элементами DOM, вы можете использовать алгоритм, описанный там.

0 голосов
/ 21 февраля 2010

Если мы можем предположить, что html совместим с xml, тогда xslt будет подходить. Но я предполагаю, что это не так, как вы, кажется, хотите написать свой собственный анализатор (не знаю, почему). Если вы действительно хотите написать парсер (я бы написал правила разбора, а не ваш собственный движок парсера), взгляните на antlr и MS oslo.

...