Я создаю инструмент, который будет проверять динамически сгенерированный XHTML и проверять его на соответствие ожидаемому содержимому.
Мне нужно подтвердить, что структура правильная и что определенные атрибуты существуют / совпадают. Могут быть другие атрибуты, которые меня не интересуют, поэтому прямое сравнение строк не подходит.
Один из способов проверить это - с помощью XPath, и я уже реализовал это, но мне также хотелось бы чего-то менее подробного - я хочу иметь возможность использовать селекторы CSS, как я могу с jQuery, но на сервере - в коде CFML - в отличие от клиента.
Есть ли библиотека CFML или Java, которая позволяет мне использовать селекторы CSS для строки XHTML?




Я не знаю самой библиотеки Java, но есть библиотека Ruby под названием Hpricot, которая делает именно то, что вы ищете. В сочетании с реализацией Ruby на платформе Java, JRuby, вызов методов Ruby из кода Java должен быть относительно простым (с использованием BSF, API сценариев JSR-222 или внутренний API).
Вы используете Coldfusion 8? Coldfusion 8, основанный на Java 6, поддерживает API-интерфейсы сценариев JSR-222 «javax.scripting».
Взгляните на эта запись в блоге о встраивании PHP в CFML. Вы должны уметь делать то же самое с Руби. В этом блоге есть ссылка на пример кода ZIP-файла, и если вы откроете CFML, вы увидите хороший пример встраивания Ruby в CFML.
Хотя может потребоваться небольшая работа, чтобы заставить все части работать вместе, но с небольшими инвестициями он должен дать вам надежный синтаксический анализ / селектор CSS-запросов, который вы ищете.
Существует теоретическая разница между сервером и клиентом. Для веб-браузера документ представляет собой живую иерархию DOM. Для вашего серверного кода это просто XML-документ любого типа. XPath - это «правильный» способ доступа к элементам XML-документа.
Поэтому, если у вас нет серьезных проблем с производительностью с вашим текущим решением XPath или оно на самом деле работает некорректно, я предлагаю вам придерживаться его. Попытка сделать что-то слишком умное может привести к поломке того, что работает.
Если вы находите XPath многословным тоже и уродливым, чтобы оставить сидеть без дела, или вам нужно больше возможностей для повторного использования инструмента в разных случаях, или просто не можете устоять перед попыткой сделать что-то умное, тогда вы можете попробовать написать утилиту, которая компилирует заданный селектор CSS в XPath. Затем вы можете вызвать это в одной строке, когда вам нужно.
XHTML, если он действителен, является подмножеством XML. В вопросе ясно говорилось, что они генерируют XHTML.
@Shawn Я постоянно разбираю HTML с помощью XPath, используя библиотеки, создающие DOM. Можете ли вы предоставить пример действительного HTML, который невозможно проанализировать?
Hpricot - определенно фантастическое решение, если для вас открыт маршрут JRuby.
Wrt. XPath - это «правильный» способ доступа к XML-документам ... извините, но это чушь. Существует множество способов доступа к элементам XML-документа: обход DOM, XPath, XQuery, селекторы CSS и многие другие. XPath, безусловно, популярен, но селекторы CSS очень мощные, если предположить, что ваш XML-документ имеет семантику HTML.
Проблема в том, что hpricot основан на собственном парсере, и я не уверен, насколько легко было бы запустить его в jRuby.
Hpricot отлично работает внутри JRuby, поскольку авторы создали Java-реализацию собственного парсера.
Я только что выпустил проект с открытым исходным кодом, который представляет собой реализацию W3C CSS Selectors Level 3 на Java. Пожалуйста, попробуйте. Я искал то же самое и решил реализовать свой собственный движок. Он вдохновлен кодом в WebKit и т. д.
http://github.com/chrsan/css-selectors/tree
Спасибо, Кристер. У меня еще не было возможности вернуться к проекту, для которого мне это было нужно, но похоже, что это именно то, что я хочу - я взгляну на какой-то момент на этой неделе и дам вам любые отзывы, которые у меня могут быть.
Выглядит очень красиво! Я мог бы рассмотреть возможность интеграции вашей библиотеки в JOOX
Если вы можете использовать PHP в своем CFML (как упоминалось выше), вы можете воспользоваться этой превосходной библиотекой «jQuery для PHP», phpQuery
Полная поддержка селектора CSS, функций манипулирования, обхода и т. д. Он должен отлично работать для того, что вам нужно.
Надеюсь, это поможет.
может быть проще использовать cQuery.com - cQuery.com - это основанная на API «движка запросов контента» для извлечения контента с действующих веб-сайтов с помощью CSS.
Вы можете использовать его программно в своем приложении.
xml! = html. вы не можете надежно разобрать html с помощью xpath