У меня есть два XML-файла, один сжатый LZW, другой в виде простого текста. Как я могу узнать, сжато или нет?
Очевидная вещь, которую нужно сделать, это, конечно, подать строку в декомпрессор LZW и посмотреть, есть ли ошибка и / или длина строки увеличивается примерно на 200%.
Это в стороне, (правильно сформированная) строка LZW или звездочки файла с магическая ценность 0x1F 0x9D
. Конечно, можно LZW сжать строку и не включите магическое значение, но это начало (очень легко проверить).
(Правильно сформированный) документ XML должен начать с объявления XML и должен начинаться с элемента, которому необязательно предшествует пробел. Объявления XML начинаются со строки <?xml
и теги элементов должны начинаться с буквы.
Поэтому, если вы видите что-либо, кроме пробелов, прежде чем встретиться с первым <
или если следующий следующий символ не ?
или буква (и только буквы и цифры следуют до >
), то строка не могу быть XML. Поскольку вы знаете, что строка является XML или сжатым XML, она должна быть сжатой. Возможно, кому-то с небольшой практикой регулярных выражений будет достаточно легко втиснуть это в шаблон из 10-15 символов.
Глупый простой тест: первый персонаж <
?
Ищите недопустимые или бессмысленные символы (например, нулевой символ). Если они существуют, то они сжаты.
Если нет, то это либо обычный XML, либо файл очень маленький (иначе это было бы крайне маловероятно).
Это поможет, если вы хотите знать, сжат ли он, и вы можете распаковать файл, и вы готовы использовать библиотеки для тяжелой работы:
Используйте библиотеку сжатия, чтобы всегда пытаться распаковать файл. Пусть он решит, был ли файл сжат. После этого передайте полученный файл в библиотеку xml и дайте этой библиотеке решить, есть ли у вас действительный и ожидаемый файл XML. Если возможно, не воссоздайте функциональность общих библиотек, просто убедитесь, что вы правильно работаете с возвращенной информацией библиотек.