metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-03-31 12:27 pm

О чтении и понимании

Нужно обмениваться данными с другой программой. Сделал для ее разработчиков документ с описанием формата на базе CSV, в котором есть такие строки:

"дата - формат dd.mm.yyyy, с выводом незначащих нулей."

"в первых трех строках последнее поле не указано, поэтому в конце строки стоит ;" (Всего полей шесть, последнее может быть пустым и чтобы парсеру не обрабатывать частные случаи - пустое последнее поле должно быть).

Присылают файл с такими строками:
"10780;11077112;31.03.2009;1.04.2009;1014"

Вопрос, что я объяснил не так?

[identity profile] metaclass.livejournal.com 2009-03-31 12:50 pm (UTC)(link)
Херассе забабоны.
А какой смысл могут нести такие ограничения, если при обработке все равно элементы по имени искать придется?

[identity profile] vp.livejournal.com 2009-03-31 12:53 pm (UTC)(link)
+1
вообще хорошо бы увидеть пример в виде такого XML

Такой пойдёт?

[identity profile] sergiej.livejournal.com 2009-04-01 09:15 am (UTC)(link)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>title</title>
</head>
<body>
<p>page</p>
</body>
</html>

Используемый http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd предполагает head непосредственно перед body и никак иначе, даже если это кому-то не нравится.

[identity profile] volodymir-k.livejournal.com 2009-03-31 01:39 pm (UTC)(link)
> при обработке все равно элементы по имени искать

Слышали, что такое DOM, SAX?

[identity profile] metaclass.livejournal.com 2009-03-31 02:15 pm (UTC)(link)
Да, в DOM я такие элементы буду искать по имени. Что нибудь вроде SelectSingleNode.
В SAX сделаю три переменных и в вызове обработчика для элемента буду заполнять их, проверяя имя элемента.
И уж всяко не стану надеятся на порядок их расположения в файле - мало ли что там может быть, например комментарий кто-нибудь всунет или еще хрень какую.

[identity profile] vp.livejournal.com 2009-03-31 02:21 pm (UTC)(link)
все равно не понятно каким боком может на что-то влиять мифический порядок элементов. Это ж технологии парсинга, не более того.

[identity profile] metaclass.livejournal.com 2009-03-31 02:41 pm (UTC)(link)
Не, вообще парсеры есть которые проверяют DTD, и соответственно, в таком случае будут проверять порядок элементов.
Но на выходе парсера обычно или дерево DOM или последовательность дерганий событий в случае SAX. Чем им поможет заданная последовательность элементов - не представляю, для меня это выглядит как аналог обращения к полям в БД по индексу Field[0], Field[2] и отгребания потом по полной программе, когда в запросе поля не в том порядке.

[identity profile] sergiej.livejournal.com 2009-03-31 03:05 pm (UTC)(link)
А если такова и есть задача - запросить поля по порядку, а не по имени? Вместо того чтобы жёстко "хардкодить" имена? Там ведь куча других параметров или выраженй по которым я могу нод дёргать, может его имя это последнее что меня интересует (хочу, к примеру создать табличку записи-поля которые имеют аттрибут "обязательный" а полей сотни не перечисляя всех сотен). Чтобы можно было решить такую задачу и добавили.
Кроме того "орднунг".

[identity profile] metaclass.livejournal.com 2009-03-31 03:12 pm (UTC)(link)
Не, не врубаюсь, особенно в пример с табличкой полей. Если дергать нод по XPath, там вроде можно по номеру к детской ноде обращаться, но имхо ничего хорошего с этого не получится :)

[identity profile] sergiej.livejournal.com 2009-03-31 03:22 pm (UTC)(link)
Ну плохая эта практика, но если нужно? Данные могут быть по полям упорядочены? Могут. Вот и введена такая возможность. Вот самый тупой пример, мне нужно XLS перевести в XML и обратно. В XLS всё построено на порядке следования. Мне что каждому полю кроме его названия ещё и его букву внутри XLS присобачивать чтобы потом обратно XLS создать?

[identity profile] metaclass.livejournal.com 2009-03-31 03:26 pm (UTC)(link)
Конечно, это же основа основ реляционной модели. Содержимое записи полностью определяется ее полями и никак не порядком в таблице.
Конечно, переносить реляционную модель прямо на XML нельзя, но конкретно этот принцип "неупорядоченности" и явного указания некоего поля для сортировки уже неоднократно меня спасал от всяческого геморроя.

[identity profile] vp.livejournal.com 2009-03-31 06:08 pm (UTC)(link)
Говно вопрос. XML это обобщенное хранилище данных, потому если нужны какие-то сущности сверх этого - это нужно реализовывать руками. Нужен порядок - извольте именовать поля как field1=xxx field2=xxx, потом грузите и сортируйте. Никто не обещает, что наши фантазии на тему XML будут поддерживаться и сохраняться при каком-нибудь пересохранении.

[identity profile] sergiej.livejournal.com 2009-04-01 09:29 am (UTC)(link)
Вы что-то путаете, XML это обобщённый язык разметки. Если для разметки требуется последовательность данных разной сущности то XML должен это обеспечивать, что он и делает.

[identity profile] vp.livejournal.com 2009-04-01 10:39 am (UTC)(link)
я не про то подумал. Я думал речь и идет о том, в каком порядке тэги идут, и что народ тэги по номерам вытягивает. Теперь все понятно и я полностью согласен. :)

[identity profile] metaclass.livejournal.com 2009-04-01 10:48 am (UTC)(link)
Так об этом речь и идет. Единственное, что похоже по номерам их таки не вытягивают, а то ведь комментарий всунул в середину - и капец номерам.

[identity profile] sergiej.livejournal.com 2009-04-01 10:56 am (UTC)(link)
Так кто его всунет если он не будет разрешён схемой в этой последовательности?

[identity profile] metaclass.livejournal.com 2009-04-01 11:02 am (UTC)(link)
Только не говори мне, что наличие комментариев тоже определяется схемой. Комментарий он же на то и комментарий, чтобы парсеру было пофиг.

[identity profile] sergiej.livejournal.com 2009-04-01 11:03 am (UTC)(link)
А пардон, правильный коментарий просто не существует, но тогда и проблемы то нет, он не вмешивается в последовательность.

[identity profile] metaclass.livejournal.com 2009-04-01 11:16 am (UTC)(link)
Вмешивается. В DOM модели он точно присутствует за каким-то хреном.

[identity profile] sergiej.livejournal.com 2009-04-01 11:22 am (UTC)(link)
Блин, ну да, в DOM есть всё, до последней запятой.

[identity profile] sergiej.livejournal.com 2009-04-01 10:53 am (UTC)(link)
:)

[identity profile] volodymir-k.livejournal.com 2009-04-02 09:10 pm (UTC)(link)
Для Вас XML это вид реляционной БД. Это в общем случае неверно -- используется Builder pattern, то есть это сложные и нерегулярные структуры данных. Понятно, что замапить любую структуру данных в реляционную можно, просто потом довольно трудно использовать SQL. Попробуйте на SQL реализовать какие-нибудь самобалансирующиеся AVL trees. Пупок развяжется.

Для решения этой проблемы и придуман DTD / XSD. Последний -- достаточно сатанинский "а-ля функциональный" язык. Например, не всякий XSD можно перевести в DTD. У XSD есть диалекты и т.д. Валидация это серьёзная тема, если Вы не понимаете её -- то скорее это Вы неправы, чем сотни опытных людей из всяких комитетов.

Для обработки регулярных структур тупой поиск по имени не подходит. Скажем, у элемента config-array будут идти последовательности из трёх строчек a1/b0/z0, не объединённые в свой элемент, их надо класть в массив. Тогда обработчик SAX должен третий элемент z0 считать разделителем объектов.

Примерно такой подход в Яве реализован в commons-digester. Мощнейшая штука. Даёте XML описание, получаете программу парсания XML в любой ВАШ объект.

[identity profile] sergiej.livejournal.com 2009-03-31 02:55 pm (UTC)(link)
Хороший вопрос, наверно для порядка :)
Я тоже поначалу думал что это зря, но потом представил себе насколько проще (по загрузке машины) с такой структурой раобтать XSLT процессору. Особенно в случае если элементов с тем же самым названием может быть много.
Ну или вот например если выражение работает не по имени тега а по другим признакам а надо чтобы порядок был, тогда при трансформации чтобы создать упорядоченный список надо процессить ещё раз - грузить машину сортировкой, в то время, как источник данных это прелестно может сделать.
Ну и последнее, чисто пользовательское, вот в банальном HTML приятно будет head искать где угодно или лучше непосредственно перед body?

[identity profile] metaclass.livejournal.com 2009-03-31 03:08 pm (UTC)(link)
XSLT разве использует DTD для работы? А без DTD ему по идее неоткуда узнать о встроенном порядке.

Я эту пакость воспринимаю как усложненный вариант БД, а в реляционных БД множество колонок и кортежей не упорядоченное, поэтому всегда сортирую отдельно.

[identity profile] sergiej.livejournal.com 2009-04-01 08:38 am (UTC)(link)
Ну это не есть усложнённый вариант БД. БД частный случай записи данных, а XML по-идее должен быть универсален. Пока что я лично не встретил таких структур данных которые нельзя бы было передать в XML, если бы такой возможности не было передача упорядоченной по полям структуры была бы возможна только с диким подвыподвертом (дополнительный аттрибут, или кодирование в id).
Одни парсеры и процессоры используют DTD, другие не используют, третьи могут использовать по желанию. Да и не в DTD дело, самый популярный XSD тоже имеет sequence, и оно широко используется.
Есть достаточное количество специфических задач в котором оно нужно. Да тот же CSV о котором пост и есть такой тип данных где порядок критичен.
Вот тут http://www.ibm.com/developerworks/xml/library/x-eleord.html товарисч пытается объяснить этот экзестенциальный вопрос, нужно оно или не нужно.