Устойчивый к ошибкам синтаксический анализ XML в Scala - PullRequest
2 голосов
/ 03 октября 2009

Я хотел бы иметь возможность анализировать XML, который не обязательно правильно сформирован. Я бы искал нечеткий, а не строгий парсер, способный, к примеру, восстанавливаться после плохо вложенных тегов. Я мог бы написать свой, но сначала стоит спросить здесь.

Обновление:

Я пытаюсь извлечь ссылки и другую информацию из HTML. В случае правильно сформированного XML я могу использовать Scala XML API. В случае плохо сформированного XML было бы неплохо каким-то образом преобразовать его в правильный XML и как-то с ним работать, иначе бы мне пришлось иметь два совершенно разных набора функций для работы с документами.

Очевидно, что входные данные не правильно сформированы, и я пытаюсь создать правильно сформированное дерево, может потребоваться некоторая эвристика (например, когда вы видите <parent><child></parent>, вы сначала закроете <child>). и когда вы видите <child>, вы игнорируете его). Но, конечно, это не правильная грамматика, и поэтому нет правильного способа сделать это.

Ответы [ 8 ]

7 голосов
/ 03 октября 2009

То, что вы ищете, не будет анализатором XML. XML очень строг в отношении вложения, закрытия и т. Д. В одном из ответов предлагается Tag Soup . Это хорошее предложение, хотя технически оно гораздо ближе к лексеру, чем к парсеру. Если все, что вам нужно из содержимого XML-ish, это поток событий без какой-либо проверки, тогда накатить собственное решение почти тривиально. Просто прокрутите ввод, потребляя контент, который соответствует регулярным выражениям (именно это и делает Tag Soup).

Проблема в том, что лексер не сможет предоставить вам многие функции, которые вы хотите получить от парсера (например, создание древовидного представления входных данных). Вы должны реализовать эту логику самостоятельно, потому что такой «снисходительный» синтаксический анализатор не сможет определить, как обрабатывать случаи, подобные следующему:

<parent>
    <child>
    </parent>
</child>

Подумайте об этом: какое дерево ожидает , чтобы получить из этого? На этот вопрос нет вменяемого ответа, именно поэтому синтаксический анализатор не очень поможет.

Это не значит, что вы не можете использовать Tag Soup (или свой собственный рукописный лексер) для создания некоторой древовидной структуры на основе этого ввода, но реализация будет очень хрупкой. С древовидными форматами, такими как XML, у вас действительно нет выбора, кроме как быть строгим, в противном случае становится практически невозможным получить разумный результат (это одна из причин того, почему браузеры испытывают трудности с совместимостью).

2 голосов
/ 02 мая 2011

Взгляните на htmlcleaner . Я успешно использовал его для преобразования «HTML из дикого» в действительный XML.

2 голосов
/ 03 октября 2009

Попробуйте парсер на объекте XHtml. Это намного мягче, чем в XML.

1 голос
/ 03 октября 2009

Я согласен с ответами, что превратить недопустимый XML в «правильный» XML невозможно.

Почему бы вам просто не сделать обычный текстовый поиск hrefs, если это все, что вас интересует? Одной из проблем будут закомментированные ссылки, но если XML является недействительным, может быть невозможно определить, что предполагается закомментировать!

1 голос
/ 03 октября 2009

Я в основном согласен с ответом Даниэля Спевака. Это просто еще один способ создать «свой собственный парсер».

Хотя я не знаю ни одного конкретного решения для Scala, вы можете попробовать использовать Woodstox , библиотеку Java, которая реализует StAX API . (Будучи равноправным API, я предполагаю , что он будет более отказоустойчивым, чем анализатор DOM)

Существует также оболочка Scala для Woodstox под названием Frostbridge , разработанная тем же человеком, который создал Simple Build Tool для Scala.

У меня были разные мнения о Фростбридже, когда я его пробовал, но, возможно, он больше подходит для ваших целей.

1 голос
/ 03 октября 2009

Попробуйте Tag Soup .

JTidy делает нечто подобное, но только для HTML.

0 голосов
/ 04 января 2011

Связанная тема (с моим решением) приведена ниже:

Разбор Scala и HTML

0 голосов
/ 15 декабря 2010

Caucho имеет совместимый с JAXP синтаксический анализатор XML, который немного более терпим, чем вы обычно ожидаете. (Включая поддержку обработки ссылок на экранированные символы, AFAIK.)

Найти JavaDoc для парсеров здесь

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