xhtml валидатор
#1
Отправлено 21 мая 2009 - 07:26
То есть, на входе, например, файлик с набором страниц для валидации, на выходе информация - какая страница из списка валидна, какая нет.
#2
Отправлено 21 мая 2009 - 09:07
#3
Отправлено 21 мая 2009 - 10:16
на эту штуковину смотрели W3 org validator ? есть простой API с использованием которого легко написать необходимое вам приложение
Смотрела, но про API ничего не нашла. Можно поподробнее?
У меня пока идею - поставить HTML tidy - и что-нибудь для него написать. Но вопрос в том, что tidy - по сути находит ошибки и может править HTML, переводить его в XHTML и т.д. но по сути валидатором не является и под стандарт не валидирует.
#5
Отправлено 21 мая 2009 - 12:45
Мы tidy используем, но вы правы, он XHTML толком не валидирует. Правда у нас такой надобности до недавнего времени и не было.У меня пока идею - поставить HTML tidy - и что-нибудь для него написать. Но вопрос в том, что tidy - по сути находит ошибки и может править HTML, переводить его в XHTML и т.д. но по сути валидатором не является и под стандарт не валидирует.
Идея у меня пока такая, во тут
http://www.w3.org/MarkUp/SCHEMA/
лежат их схемы. Если найти правильную и просто запустить любой XML валидатор с этой схемой - то должно сработать.
Думаю, что правильную схему можно вычислить из dtd файла в <!DOCTYPE...> XHTML-ного файла.
Любым XML валидатором может быть xerces - http://xerces.apache.org/xerces2-j/
Запускать примерно так:
set x_dir=C:\java\xerces
java -cp %x_dir%\xercesSamples.jar;%x_dir%\xml-apis.jar;%x_dir%\xercesImpl.jar jaxp.SourceValidator -vs stream -i example.xml -a schema.xsd
Alexey
#6
Отправлено 25 мая 2009 - 21:18
Недавно решал подобную проблему, но просто через джаву...Пытаюсь найти инструмент, который бы позволял валидировать заданный заранее набор страниц. Желательно консольный.
То есть, на входе, например, файлик с набором страниц для валидации, на выходе информация - какая страница из списка валидна, какая нет.
Задание было провалидировать список страниц, которые уже лежали у катомера. Вот метод, который пришлось навоять:
import org.w3c.dom.Document; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.net.URL; ..... ..... ..... public static Document getDocument(URL url) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; try { db = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } if (db == null) { throw new IllegalStateException("Document Builder ERROR."); } Document dom = null; HttpURLConnection urlConnection = null; try { urlConnection = (HttpURLConnection) url.openConnection(); dom = db.parse(urlConnection.getInputStream()); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally{ urlConnection.disconnect(); urlConnection = null; } if (dom == null) { throw new IllegalStateException("URL "+url.toExternalForm()+": DOM is not built"); } return dom; }
Т.е. по существу, если в строке "dom = db.parse(urlConnection.getInputStream());" генерился Exception, то что-то не так было со страницей...
Как вариант можно переписать метод на прием файлов и т.д и т.п.
Так что, наверное вам будет проще и быстрее написать свой код, чем искать готовый инструмент...
2 All: Если я где-то не прав, то с удовольствием приму ваши возражения и критику...
Про Тестинг
#7
Отправлено 26 мая 2009 - 10:04
Это не критика, а вопросы:2 All: Если я где-то не прав, то с удовольствием приму ваши возражения и критику...
В данном случае
1) валидация происходит против DTD прописанной в самом файле или просто получается проверка на то что документ well-formed?
Дальше подразумеваю, что на вопрос (1) ответ Да.
2) если в документе нет <!DOCTYPE декларации, то валидации не будет, так?
3) есть ли доказательство того, что DTD полностью описывает схему? Т.е. не надо ли все-таки XSD файлы использовать, чтобы уж наверняка?
Alexey
#8
Отправлено 26 мая 2009 - 13:18
Это не критика, а вопросы:2 All: Если я где-то не прав, то с удовольствием приму ваши возражения и критику...
В данном случае
1) валидация происходит против DTD прописанной в самом файле или просто получается проверка на то что документ well-formed?
Дальше подразумеваю, что на вопрос (1) ответ Да.
2) если в документе нет <!DOCTYPE декларации, то валидации не будет, так?
3) есть ли доказательство того, что DTD полностью описывает схему? Т.е. не надо ли все-таки XSD файлы использовать, чтобы уж наверняка?
Шапака проверяемых мной доков была вот какая:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
После многочисленных багфиксов все файлы все таки прошли валидацию.
Решил сейчас немного поэкспериментировать, закомментил первую строку "<!DOCTYPE html ". Запустил валидатор и получил пачку ошибок... Так что думаю, что ДТД все же нужны :) если их нет, то проверка идет по валидности самого xml.
конечно, если нет уверенности "что DTD полностью описывает схему", придется все сложнее делать...
Про Тестинг
#9
Отправлено 08 июня 2009 - 07:58
Про Тестинг
#10
Отправлено 11 июня 2009 - 17:12
Привет!Можно ли узнать на чем, все же остановился выбор???
Наконец-то руки добрались до реализации такой проверки. Сразу оговорюсь, по условиям задачи мне необходимо валидировать не просто XHTML документы, а XHTML-Basic1.1 (что есть сабсет от полного XHTML). Да, еще надо добавить, что я проверяю файлы на диске локально, не те которые где-то там на http живут, т.е command-line решение нужно.
Итак, мой подход описанный тут - не годится. По указанной там ссылке на схемы, схема для XHTML-Basic1.1 битая. Более того, из нормативных W3C документов следует, что драйвером является DTD. ОК, такой подход забраковали.
Теперь, Алексей, твой подход описанный тут - не годится. Такая реализация будет проверять только то, что документ well-formed. Задача при валидации шире - проверить, что документ well-designed, т.е. соотвествует заданой структуре и ограничениям по типам.
Чтобы это заработало как надо, в предложенный код необходимо добавить следующие строки
dbf.setNamespaceAware(true); dbf.setValidating(true);Ну я еще и ErrorHandler до кучи написал, т.к. дефолтный спамит.
Результат - это работает. Назовем решением №1.
Теперь пара других решений.
1. С помощью программы wget, или других подручных средств выкачиваем DTD-хи.
2.1. С помощью конвертера trang преобразовываем DTD в XSD.
2.2. С помощью этого же конвертера преобразовываем DTD в RNG(RELAXNG).
3. Валидируем, используя любой валидатор для XSD, например xerces. Назовем это решение №2.
4. Валидируем, используя RNG валидатор jing (живет вместе с trang :). Назовем это решение №3.
Дальше, имея три решения, надо выбрать то, которое более всего устраивает.
А. Все три подхода находят ошибки в одних и тех же местах.
Б. По скорости: чуть быстрее валидация против DTD, RNG и XSD примерно одно и тоже время (набор из 85 файлов). Но есть нюанс. Валидация против DTD требует доступа в инет и берет DTD-шки непосредственно с сайта W3C, RNG и XSD работают с локальными файлами.
В. По реализации: для DTD и XSD теоритически можно запустить java один раз и передать на вход весь список тестируемых файлов. С jing-ом(RNG) такое не прокатывает, т.к. он прекращает валидировать на первом файле, который вызывает fatal error (например, не well-formed XML-файл). Для RNG надо запускать java, для каждого файла.
Г. По аутпуту: здесь вне конкуренции RNG, т.к. он честно выписывает все ошибки. Потом DTD, т.к. читабельно. Затем нечитабельный XSD. Все это, ессно, зависит от реализации валидаторов.
Для сравнения:
test.html:13:91: error: bad value for attribute "method"
test.html:14:39: error: element "label" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:15:52: error: element "input" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:15:57: error: element "br" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:17:39: error: element "label" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:18:52: error: element "input" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:18:57: error: element "br" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:20:72: error: element "input" from namespace "http://www.w3.org/1999/xhtml" not allowed in this context
test.html:21:20: error: unfinished element
ERROR :: test.html[13,91] :: Attribute "method" with value "POST" must have a value from the list "get post ".
ERROR :: test.html[21,20] :: The content of element type "form" must match "(h1|h2|h3|h4|h5|h6|ul|ol|dl|p|div|pre|blockquote|address|hr|table|script|noscript|fieldset)+".
[Error] test.html:13:91: cvc-enumeration-valid: Value 'POST' is not facet-valid with respect to enumeration '[get, post]'. It must be a value from the enumeration.
[Error] test.html:13:91: cvc-attribute.3: The value 'POST' of attribute 'method' on element 'form' is not valid with respect to its type, 'null'.
[Error] test.html:14:39: cvc-complex-type.2.4.a: Invalid content was found starting with element 'label'. One of '{Heading.class, List.class, BlkStruct.class, BlkPhras.class, BlkPres.class, Table.class, Misc.class, "http://www.w3.org/19...html":fieldset}' is expected.
Мой выбор, на данный момент - RELAXNG. На досуге посмотрю как это в Ruby работает и может от джавы откажусь вообще.
Alexey
#11
Отправлено 12 июня 2009 - 07:53
PS В этом ответе вижу замечательную статью о проблемах выбора инструмента для валидации XHTML документов...
Про Тестинг
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных