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] sergiej.livejournal.com 2009-03-31 11:20 am (UTC)(link)
А потом будет ответ как я однажды получил: "а что у вас в XML важен порядок полей?!?!?!"

[identity profile] vp.livejournal.com 2009-03-31 12:14 pm (UTC)(link)
а что, важен? :)

[identity profile] sergiej.livejournal.com 2009-03-31 12:31 pm (UTC)(link)
:) ну если прописано через ","
<!ELEMENT чел (возраст, рост, пол)>
если пол будет перед ростом, то файл невалидный.

[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 создать?

(no subject)

[identity profile] metaclass.livejournal.com - 2009-03-31 15:26 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2009-03-31 18:08 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2009-04-01 09:29 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2009-04-01 10:39 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2009-04-01 10:48 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2009-04-01 10:56 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2009-04-01 11:02 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2009-04-01 11:03 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2009-04-01 11:16 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2009-04-01 11:22 (UTC) - Expand

(no subject)

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

[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 товарисч пытается объяснить этот экзестенциальный вопрос, нужно оно или не нужно.

[identity profile] http://users.livejournal.com/_windwalker_/ 2009-03-31 09:49 pm (UTC)(link)
скорее уж будет определено при помощи схемы, и перцы получат отлуп в момент де-сериализации их xml-подобного говна в instance жаба-класса.

[identity profile] sergiej.livejournal.com 2009-04-01 08:44 am (UTC)(link)
А DTD и есть схема, и если "перцы" получили DTD и XSD и если они готовят XML ручками, или какой-то своей гениальной библиотекой на забытом всеми языке, то могли бы проверить валидность своего выхода. Валидацию на входе/выходе в период отладки интеграции лучше включать всегда, иначе запуск каждого интерфейса будет занимать недели пинг-понга "а это вы не то" : "а это вы не то".

[identity profile] http://users.livejournal.com/_windwalker_/ 2009-04-01 09:00 am (UTC)(link)
ну в принципе, DTD != схеме (xml schema), дтд не позволяет задать некоторых важных ограничений, например насколько много может быть определённых элементов, уникалость ключей, итп...

А так насчёт того, что бы товарищи у себя проверяли на валидность xml-я - вполне согласен

[identity profile] sergiej.livejournal.com 2009-04-01 09:18 am (UTC)(link)
DTD один из языков схемы XML, XSD это тоже один из языков схемы, то что он в названии претендует на то что он и есть схема это его личная проблема, например RELAX NG ничуть не хуже.

[identity profile] http://users.livejournal.com/_windwalker_/ 2009-04-01 09:45 am (UTC)(link)
В упор не вижу в базовом нормативном документе ни одного определения, которое называет DTD schema.

[Definition: The XML document type declaration contains or points to markup declarations that provide a grammar for a class of documents. This grammar is known as a document type definition, or DTD. The document type declaration can point to an external subset (a special kind of external entity) containing markup declarations, or can contain the markup declarations directly in an internal subset, or can do both. The DTD for a document consists of both subsets taken together.]

[identity profile] sergiej.livejournal.com 2009-04-01 09:51 am (UTC)(link)
ещё не хватало чтобы W3C продвигая свой язык схемы как единственный кошерный призналось что DTD это тоже схема :)
http://en.wikipedia.org/wiki/Document_Type_Definition

[identity profile] http://users.livejournal.com/_windwalker_/ 2009-04-01 09:55 am (UTC)(link)
А я напишу что в педивикии, что DTD- это гриб. Там не статья интересна, а обсуждение.
Ну вообще DTD не отделим от XML. А схема (relax-ng, или XML Schema) всё - таки внешняя сущность.

[identity profile] sergiej.livejournal.com 2009-04-01 10:15 am (UTC)(link)
Ну блин, был DTD потом W3C придумали XSD. И то и то для описания схемы документа. И то и то можно использовать для валидации и процессинга XML о чём спор то? Что у XSD больше возможностей? Кто с этим спорит?