xml файл - isValid

Kirill

Новичок
xml файл - isValid

Мне необходимо парсить xml файлы с помощью XMLReader. Перед началом парсинга хочу проверить, что файл - валидный xml документ. Как это сделать? Создавать XSD или RelaxNG схемы - не хочется - и времени жалко и формат файлов может поменяться.

Сейчас можно вместо xml файла подпихнуть все что угодно - в результате при чтении куча ворнингов вывалится.

-~{}~ 12.03.09 13:12:

не в тот форум запостил - туплю...
 

FB3

Новичок
XMLReader - потоковый парсер, соответственно, с помощью него никак не проверить. Выкидывай ошибку пользователю, как только XMLReader выкинет и останавливай парсер.
XSD схемой проверять - скорей всего нужно загрузить и то и то в память сначала. Соответственно, если файлы будут большие, то памяти может не хватить и вообще тормозить будет.
 

Alexandre

PHPПенсионер
для валидности использую xmlwf
можно xmllint - более строгая проверак
 

Kirill

Новичок
а не подскажите, с какими опциями Вы проверяете с помощью xmlwf?

exec('xmlwf -e UTF-8 ' . escapeshellarg($this->_filePath), $output, $returnVar);
$returnVar - в любом случае содержит 0.

exec('xmllint ' . escapeshellarg($this->_filePath) . ' > /dev/null', $output, $returnVar);
$returnVar - в случае успешной проверки содержит 0, иначе 1.

Как с помощью xmlwf произвести проверку, чтобы в $returnVar был результат? Можно конечно по $output - если он пустой, то по идее все гуд, иначе файл содержит ошибки.

-~{}~ 16.03.09 15:38:

P.S.
в чем заключается строгость xmllint?
 

slach

Новичок
ну вообще то результат в $output
а в $returnVar там exit code лежит от xmlwf
который если больше 0 то значит была ошибка

какая именно лежит в $output


Kirill
насчет xmllint ты что такое well-formed и not-valid хорошо различаешь?
 

Kirill

Новичок
exit code лежит от xmlwf всегда 0.

slach
поправь если не прав
Well-formed - документ правильно построенный согласно синтаксису XML, те нету незакрытых тегов, левых каычек в атрбутах и тд

not-valid - это когда есть какая то схема xml документа, и xml документ не соответствует этой схеме - те проверяется структура документа, например тег каталог может быть только один и только как потомок тега shop и тд
 

Rin

*
Если получать номер позиции, на которой произошла ошибка, не трубуется, то можно использовать регул. выражение.

PHP:
$xml_regex = '{
    ^(
    (?: <(\w++) [^>]*+ (?<!/)> (?1) </\2> # matched pair of tags
        | [^<>]++                                       # non-tag stuff
        | <\w[^>]*+/>                                # self-closing tag
        | <!--.*?-->                                    # comment
        | <!\[CDATA\[.*?]]>                             # cdata block
        | <\?.*?\?>                                     # processing instruction
        | <![A-Z].*?>                                   # Entity declaration, etc.
    )*+
    )$
    }sx';
    if (preg_match($xml_regex, $xml_string))
        echo "block structure seems valid\n";
    else
        echo "block structure seems invalid\n";
http://uu54.cn/lib/regular/regex3-CHP-10-SECT-7.html#IDX-CHP-10-3629

См. так же Check to valid XHTML 1.1 Strict
 
Сверху