Перейти к содержимому

Фотография

xhtml валидатор


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 wheezle

wheezle

    Новый участник

  • Members
  • Pip
  • 2 сообщений

Отправлено 21 мая 2009 - 07:26

Пытаюсь найти инструмент, который бы позволял валидировать заданный заранее набор страниц. Желательно консольный.

То есть, на входе, например, файлик с набором страниц для валидации, на выходе информация - какая страница из списка валидна, какая нет.
  • 0

#2 popo_kid

popo_kid

    Активный участник

  • Members
  • PipPip
  • 79 сообщений

Отправлено 21 мая 2009 - 09:07

на эту штуковину смотрели W3 org validator ? есть простой API с использованием которого легко написать необходимое вам приложение
  • 0

#3 wheezle

wheezle

    Новый участник

  • Members
  • Pip
  • 2 сообщений

Отправлено 21 мая 2009 - 10:16

на эту штуковину смотрели W3 org validator ? есть простой API с использованием которого легко написать необходимое вам приложение


Смотрела, но про API ничего не нашла. Можно поподробнее?

У меня пока идею - поставить HTML tidy - и что-нибудь для него написать. Но вопрос в том, что tidy - по сути находит ошибки и может править HTML, переводить его в XHTML и т.д. но по сути валидатором не является и под стандарт не валидирует.
  • 0

#4 popo_kid

popo_kid

    Активный участник

  • Members
  • PipPip
  • 79 сообщений

Отправлено 21 мая 2009 - 11:23

а ссылку на Docs смотрели? API
  • 0

#5 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 21 мая 2009 - 12:45

У меня пока идею - поставить HTML tidy - и что-нибудь для него написать. Но вопрос в том, что tidy - по сути находит ошибки и может править HTML, переводить его в XHTML и т.д. но по сути валидатором не является и под стандарт не валидирует.

Мы tidy используем, но вы правы, он 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
  • 0
Regards,
Alexey

#6 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 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: Если я где-то не прав, то с удовольствием приму ваши возражения и критику...
  • 0
Алексей Булат
Про Тестинг

#7 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 26 мая 2009 - 10:04

2 All: Если я где-то не прав, то с удовольствием приму ваши возражения и критику...

Это не критика, а вопросы:
В данном случае
1) валидация происходит против DTD прописанной в самом файле или просто получается проверка на то что документ well-formed?
Дальше подразумеваю, что на вопрос (1) ответ Да.
2) если в документе нет <!DOCTYPE декларации, то валидации не будет, так?
3) есть ли доказательство того, что DTD полностью описывает схему? Т.е. не надо ли все-таки XSD файлы использовать, чтобы уж наверняка?
  • 0
Regards,
Alexey

#8 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 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 полностью описывает схему", придется все сложнее делать...
  • 0
Алексей Булат
Про Тестинг

#9 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 08 июня 2009 - 07:58

Можно ли узнать на чем, все же остановился выбор???
  • 0
Алексей Булат
Про Тестинг

#10 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 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 работает и может от джавы откажусь вообще.
  • 0
Regards,
Alexey

#11 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 12 июня 2009 - 07:53

Спасибо, прочитал с удовольствием...

PS В этом ответе вижу замечательную статью о проблемах выбора инструмента для валидации XHTML документов...
  • 0
Алексей Булат
Про Тестинг


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных