LINUX.ORG.RU

Парсинг кривых XML

 ,


0

1

Здравствуйте, мои дорогие любители и профессионалы.

Чем и как принято на php парсить кривые XML?

В моём случае кривость заключается в несоответствии кодировки атрибутов тегов заявленной в преамбуле.

Не спешите советовать, дескать «перекодируй файл в нужную». Ибо кодировок, используемых в этом XML не менее 3 (UTF-8, сp1251, cp866).

Я уже помолился Патрику по поводу ниспослания автору сего поделия кровавого поноса с кусочками битых 6-х айфонов, только делу этим не поможешь, ибо ни имя ни координаты автора сего неизвестны.

Объём XML - файла - 10МБ, искать и править руками - нереально.

Были последовательно испробованы

simple_xml

DOMDocument

XMLReader

Всё шлёт меня на йух.

p.s. как предпоследний вариант готов рассмотреть консольную прогу, которую буду вызывать через system

p.p.s. В качестве последнего варианта, буду материться и писать парсер сам, так как структура этого XML не очень сложная

★☆☆

Попробуй распарсить python lxml, он емнип поадекватней будет чем пхпшный simplexml. Один раз распарсь, сериализуй, залей в файлик, читай из php.

NeverLoved ★★★★★
()

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

utf-8 от двух последних отличается элементарно.

cp1251 от cp866 чуть сложенее но думаю реально.

Jaberwock ★★★
()

На каком языке данные? На русском?

Jaberwock ★★★
()

Всё шлёт меня на йух.

ТелепаКак именно шлёт? Грязно ругаясь, вываливает exception или ниасиливает правильно определить кодировку?

heilkitty ★★
()
Последнее исправление: heilkitty (всего исправлений: 1)

содержимое большими или маленькими буквами набрано?

Jaberwock ★★★
()

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

amomymous ★★★
()

Провайдерам сайты блокировать помогаешь али просто одинэсник какой?

anonymous
()

несоответствии кодировки атрибутов тегов заявленной в преамбуле.

кодировок, используемых в этом XML не менее 3 (UTF-8, сp1251, cp866)

Зачем перекодировать файл? Меняй название кодировки в преамбуле. В цикле. Если xml распарсился, значит угадал кодировку

anonymous
()

*Парсер* тут не поможет. Поможет *лексер*. Тебе нужно вклинится между лексером и парсером и поправить кривые токены.

Если лексер слишком умный и пытается перекодировать имена атрибутов во внутреннее представление, то придётся писать свой вариант лексера.

Если модель данных известна это делается тривиально табличкой подстановок.

Если модель данных неизвестна/нефиксирована, то придется шаманить с определением типа кодировки.

Macil ★★★★★
()

Решилось так: номенклатура аттров, в которых пишут в кривых кодировках ограничивается Caption и Text.

Детектим в таких аттрах кодировку между utf-8 cp1251 и cp866 (это вполне успешно делается по среднему коду символа) и переводим в utf-8

Затем уже кормим да хотя бы тому же simple_xml

r_asian ★☆☆
() автор топика
Ответ на: комментарий от Jaberwock

Это костыль, а не решение. Я надеялся, что будет какая-то настройка стандартных класов, которая позволяет не так строго подходить к синтаксису XML.

Ну да ладно, решенная так решенная.

r_asian ★☆☆
() автор топика
Ответ на: комментарий от r_asian

Не строго к синтаксису ХМЛ по идее подходить нельзя, но ошибки обрабатывать можно, тут от парсера зависит.

Попробуй SAX парсер какой-нибудь.

Питоновый Beautifull Soup на любые вроде ошибки умеет забивать

Kalashnikov ★★★
()

Что считается кривым XML ?

anonymous
()

SAX или любой событийный парсер.

vtVitus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.