Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Вниз

Мысли по поводу структуры XML   Найти похожие ветки 

 
Галинка   (2008-06-26 15:26) [0]

Собственно появилась мысля, сделать сохранение скрипта в таком вот формате. Появилась она во многом, благодаря требованию читабельности. Теперь вот обдумывается вопросик: хранить ли нужные параметру в тексте (1) узла, или в аттрибутах (2). Два примера:

1.
<Script>
   <Command>
       <Action>send</Action>
       <Parameter>2#3030303ett</Parameter>
  </Command>
  <Command>
       <Action>checkCursor</Action>
       <Parameter>2408</Parameter>
  </Command>
</Script>

2.
<Script>
   <Command Action="send"  Parameter="2#3030303ett"   </Command>
   <Command Action="checkCursor" Parameter="2408"     </Command>
</Script>

Что кроме компактности дают аттрибуты? Понижают "глубину" вложений? Легчи распарсить узел с аттрибутами, чем с вложенными нодами?


 
Поросенок Винни-Пух ©   (2008-06-26 15:31) [1]

так выглядит поиск узла с атрибутами.  Это наглядно и читабельно:

"/Script/Command[@Action="send"]"

А если данные в тексте узла?


 
Галинка   (2008-06-26 15:34) [2]

+1 за атрибуты.

Еще какие мысли?


 
Dennis I. Komarov ©   (2008-06-26 15:38) [3]

+1 за атрибуты по логике: параметры принадлежат действию, у них разный иерархический уровень. В (1) они на одном.

ЗЫ Выразился как смог :)


 
Ega23 ©   (2008-06-26 15:39) [4]

Не дай бог " встретится...


 
Dennis I. Komarov ©   (2008-06-26 15:41) [5]

> [4] Ega23 ©   (26.06.08 15:39)

&....;


 
Поросенок Винни-Пух ©   (2008-06-26 15:43) [6]

В общем все станет ясно как только начнешь писать код ищущий то что надо. Тот, что будет проще тот и скажет что лучше.


 
Ega23 ©   (2008-06-26 15:45) [7]


> &....;


да-да, и парсить это...


 
Поросенок Винни-Пух ©   (2008-06-26 15:46) [8]

а зачем это парсить?


 
Dennis I. Komarov ©   (2008-06-26 15:51) [9]

> [7] Ega23 ©   (26.06.08 15:45)

ну так жизнь веселая штука


 
b z   (2008-06-26 15:57) [10]

Мой вариант:
<Script>
 <Command Action="send"><Parameter Value="2#3030303ett" /></Command>
 <Command Action="checkCursor"><Parameter Value="2408" /></Command>
</Script>


 
Галинка   (2008-06-26 16:05) [11]


> Ega23 ©   (26.06.08 15:39) [4]
>
> Dennis I. Komarov ©   (26.06.08 15:41) [5]
>


такое встретится не может. Сам хмл будет создавать на основе скрипта, в котором с десяток разновидностей команд. Но вот сам скрипт может содержать несколько десятков таких строк. Поэтому если все паковать в подузлы, то обзор потеряется очень быстро...


 
antonn ©   (2008-06-26 16:25) [12]


> Не дай бог " встретится...

addslashes, stripslashes :)


 
Ega23 ©   (2008-06-26 16:28) [13]

Минусы:
1. Слишком избыточен
2. Здоровый по размеру, бо всё суть строка
3. Не везде есть DOM.

Плюсы:
1. x-path
2. Можно редактировать в любом текстовом редакторе
3. Почти везде есть DOM. :)


 
Галинка   (2008-06-26 16:36) [14]

Ega23 ©   (26.06.08 16:28) [13]

это ты сейчас о чем? ))) Если о применении хмл-а вообще, то это уже не обсуждается. Обсуджается только структура.

Да и еще, может релевантно. Запускаться вся эта байда будет из командной строки. Типа:

testkasse sales.xml

Если при анализу файла будут обнаружены ошибки, тест просто не пойдет. (Тончее это задумка такая)


 
Ломброзо ©   (2008-06-26 16:37) [15]

Парсинг XML-я вручную - это вообще прошлый век. Все нормальные платформы уже давно предоставляют инфраструктуру для автоматической сериализации и десериализации кортежей объектов в- и из XML. Пометил что надо атрибутами - и вуаля. А сериализатор, ориентируясь на метаданные, сам решает, что писать в атрибуты XML, а что в узлы.


 
Ломброзо ©   (2008-06-26 16:40) [16]

> Если при анализу файла будут обнаружены ошибки
Структурный анализ файла можно возложить на реализованные практически во всех современных парсерах валидаторы соответствия XML некоей схеме (DTD, XSD и т.п.)


 
Галинка   (2008-06-26 16:47) [17]

Ломброзо ©   (26.06.08 16:37) [15]

копаю вроде в этом направлении. Пока то, что делает XmlSerializer по-умолчанию не удовлетворяет. Скажи куда копать глубже? И про валидацию тоже.


 
Галинка   (2008-06-26 16:54) [18]

Ломброзо, посмотрела про сериализацию классов. Но проблема пока видится в том, что мне так и так придется распарсивать строки, которые в ListBox находятся. Так что придется всеж таки ручками наверное. Или как ты считаешь?


 
Ломброзо ©   (2008-06-26 16:56) [19]

System.Xml.Serialization, XmlAttributeAttribute, XmlElementAttribute
System.Xml.Schema


 
Галинка   (2008-06-26 17:03) [20]

Ломброзо ©   (26.06.08 16:56) [19]

Именно это и читаю. Но там применительно, как ты совершенно справедливо заметил, к кортежам объектов. А у меня оди единственный объект - ListBox. Его строки - это строки нашего скрипта, которые и требуется по возможности читабельно, сериализовать в хмл.


 
Ломброзо ©   (2008-06-26 17:05) [21]

А обернуть строку скрипта в некий сериализуемый в XML класс, переопределить ему метод ToString() и запихать коллекцию экземпляров этого класса в ListBox разве сложно? :) Перед сохранением нужно всего-то выгрести эти объекты в любую коллекцию или массив - и получим сериализуемую коллекцию объектов.


 
Alkid   (2008-06-26 17:06) [22]

Ох, дурная это затея - в XML скрипты оформлять, дурная...


 
Поросенок Винни-Пух ©   (2008-06-26 17:09) [23]

Видимо фаст репорт дурные люди написали


 
Галинка   (2008-06-26 17:14) [24]

Ломброзо ©   (26.06.08 17:05) [21]

посмотрела проект. Это оказывается и правда объекты класса t_action и в проекте они собраны в список List<t_action> Liste = new List<t_action>(); А в листбоксе отображаются только как строки. Это самое действие имеет type и text. Я как-то попала не глядя, только назвала это Action и Parameter соответственно. Теперь только осталось сириализовать этот список с нужным набором аттрибутов? Я правильно поняла?


 
Галинка   (2008-06-26 17:15) [25]

Alkid   (26.06.08 17:06) [22]

ну кому как. Просто это наиболее репрезентативная из привычных форма представления информации.


 
Ломброзо ©   (2008-06-26 17:17) [26]

Галинка   (26.06.08 17:14) [24]

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


 
VirEx ©   (2008-06-26 19:09) [27]

<Command Action="send"  Parameter="2#3030303ett">   </Command>
лишнее, можно так:
<Command Action="send"  Parameter="2#3030303ett" />


 
Галинка   (2008-06-26 19:19) [28]

обрадовали сейчас. Нада на жабе теперь делать (((


 
Dummy   (2008-06-26 19:40) [29]


> Собственно появилась мысля, сделать сохранение скрипта в
> таком вот формате. Появилась она во многом, благодаря требованию
> читабельности. Теперь вот обдумывается вопросик: хранить
> ли нужные параметру в тексте (1) узла, или в аттрибутах
> (2). Два примера:

Велосипед изобретаем? SyncML вам в помощь.

По существу - упаси Боже с таким работать. Это ж застрелиться можно.


 
DVM ©   (2008-06-26 20:37) [30]


> Галинка  


Я когда то делал подобное, был выбор XML или нет. Решил делать без XML. Для таких простых вещей он только помеха. Реплики выглядили так:

Action: ActionType<cr><lf>
Param1: Value1<cr><lf>
Param1: Value1<cr><lf>
Param1: Value1<cr><lf>
Param1: Value1<cr><lf>
ActionID: UniqueID<cr><lf><cr><lf>

В эту структуру можно уложить в общем то любую информацию, в том числе и бинарную, при желании. Вложеннности нет, но мне она и не нужна была.


 
VirEx ©   (2008-06-26 20:54) [31]

впринципе если настроек немного, можно напряч саму дельфю для настроек:
1. сделать TCantainer с паблишед свойствами Name, Descr, Script
2.

//важные процедуры для сохранения
protected
 procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
 procedure SetParentComponent(Value: TComponent); override;
public
 procedure SaveContainer(FileName: string; Encrypt: Boolean); virtual;
 procedure LoadContainer(FileName: string; Encrypt: Boolean); virtual;

procedure TContainer.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
 I: Integer;
 OwnedComponent: TComponent;
begin
 inherited GetChildren(Proc, Root);
 for I := 0 to ComponentCount - 1 do
 begin
   OwnedComponent := Components[I];
   if not OwnedComponent.HasParent then Proc(OwnedComponent);
 end;
end;

procedure TInventory.SetParentComponent(Value: TComponent);
begin
 inherited;
end;

procedure TContainer.LoadContainer(FileName: string; Encrypt: Boolean);
var
 FileStream: TFileStream;
 MemStream: TMemoryStream;
 EncryptStream: TMemoryStream;
begin
 if not fileexists(Filename) then exit;
 DestroyComponents; //&#243;&#228;&#224;&#235;&#255;&#229;&#236; &#241;&#242;&#224;&#240;&#252;&#184;
 Classes.RegisterClass(TContainer); //&#225;&#224;&#231;&#238;&#226;&#251;&#233; &#234;&#235;&#224;&#241;&#241; &#240;&#229;&#227;&#232;&#241;&#242;&#240;&#232;&#240;&#243;&#229;&#236;-&#241;
 //если будешь делать на основе контейнера компоненты, то здесь их регистрируй

 FileStream := TFileStream.Create(FileName, 0);
 MemStream := TMemoryStream.Create;
 try
   if (not Encrypt) or (not Assigned(EncrypteProc)) then
     ObjectTextToBinary(FileStream, MemStream)
   else begin
     EncryptStream := TMemoryStream.Create;
     EncrypteProc(FileStream, EncryptStream, aDecrypt);
     ObjectTextToBinary(EncryptStream, MemStream);
     EncryptStream.Free;
   end;
   MemStream.Position := 0;
   MemStream.ReadComponent(self);
 finally
   MemStream.Free;
   FileStream.Free;
 end;
end;

procedure TContainer.SaveContainer(FileName: string; Encrypt: Boolean);
var
 FileStream: TFileStream;
 MemStream: TMemoryStream;
 EncryptStream: TMemoryStream;
begin
 FileStream := TFileStream.Create(FileName, fmCreate);
 MemStream := TMemoryStream.Create;
 try
   MemStream.WriteComponent(self);
   MemStream.Position := 0;
   if (not Encrypt) or (not Assigned(EncrypteProc)) then
     ObjectBinaryToText(MemStream, FileStream)
   else begin
     EncryptStream := TMemoryStream.Create;
     ObjectBinaryToText(MemStream, EncryptStream);
     EncrypteProc(EncryptStream, FileStream, aEncrypt);
     EncryptStream.Free;
   end;
 finally
   MemStream.Free;
   FileStream.Free;
 end;
end;


Encrypt потри, эт я для шифрации типа делал :)

вот пример сохранёнки (TInventory, THost, TItem это TContainer со своими уникльными паблишед свойствами)

object TInventory
 User = "User"
 Password = "pass"
 Limit = 0
 object THost
   Name = "tsclient"
   Caption = "tsclient"
   object TItem
     Name = "Win32_Processor"
     Caption = "sdf"
     object TValue
       Name = "Name"
       Caption = "gggsdfg"
     end
     object TValue
       Name = "Caption"
       Caption = "sdfsdfasdf"
     end
...........................
   end
 end
end


 
VirEx ©   (2008-06-26 20:58) [32]

блин, сколько ошибок наделал :(


 
VirEx ©   (2008-06-26 21:15) [33]

вот как пример:

TScript=class(TContainer)
TCommand=class(TContainer)
...

в коде:
s:=TScript.create(nil);
s.Name:="скрипты";
c:=TCommand.create(s);
c.Action:="act1";
c.Parameter:="aaa";
//можно добавить такую функцию
witn s.NewCommand do
 Action:="act2";
 Parameter:="bbb";
end;
//или так
s.NewCommand("act3","ccc");
s.SaveContainer("Scripts.txt");

s.LoadContainer("Scripts1.txt");
for I := 0 to s.ComponentCount - 1 do
   c:=s.Components[I];


 
_ShaggyDoc   (2008-06-27 06:48) [34]

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

Тем не менее, есть мнение, что в атрибутах надо хранить информацию, не являющуюся частью самих данных (метаданные), а в тексте - сами данные.

Считается что с атрибутами есть проблемы:

а) атрибуты, в отличие от дочерних элементов, не могут содержать больше одного значения

б) при внесении изменений атрибуты тяжело расширяются  

в) атрибутами нельзя описать структуры

г) программам тяжело работать с атрибутами

д) атрибуты не легко проконтролировать на соответствие единому ОТД — определению типа документа, устанавливающему валидность того или иного XML документа.

Я лично с этими проблемами не столкнулся. Возможно пока. Лично мне пока в атрибутах мешает необходимость хранить в значениях текст с кавычками. Это такая специфика - я труда включаю программные макросы, у которых встречаются двойные кавычки. Следовательно, значение атрибута должно быть обрамлено одинарными кавычками. Но "шибко умные" парсеры, наподобие MSXML непременно заменяют все кавычки на двойные, чего мне не надо. Решил вопрос альтернативным парсером, который никакой отсебятины не вносит, да и работает раз в 10 быстрее.

Но, в данном случае, правильнее было бы вынести эти данные в текст. Сдерживает пока то, что мне надо непременно отображать элементы XML визуально в дереве, а лишние - не нужны. Но это решаемо. Только руки не доходят переделать.


 
homm ©   (2008-06-27 08:26) [35]

Преимущество XML в структурировании информации. Скрипт — последовательный набор команд. Нафига козе баян?


 
Галинка   (2008-06-27 10:02) [36]

_ShaggyDoc   (27.06.08 06:48) [34]

спасибо за обстоятельный ответ. Поробовала вчера XMLSerializer. Он поступает так же. Т.е. если делать сериализацию и десериализацию, то в принципе лучше брать родную структуру. Чтобы не делать свой парсер.

ПыСы: эта байда должна быть на жаве и вроде под линухом.


 
VirEx ©   (2008-06-27 10:21) [37]

ну в джаве IZEN спец...


 
Галинка   (2008-06-27 10:54) [38]

надо его позвать )))


 
DiamondShark ©   (2008-06-27 12:54) [39]


> Поросенок Винни-Пух ©   (26.06.08 15:31) [1]
> так выглядит поиск узла с атрибутами.  Это наглядно и читабельно:
> "/Script/Command[@Action="send"]"А если данные в тексте
> узла?

То тогда

/Script/Command[Action="send"]

Ничуть не менее наглядно и читабельно.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.022 c
3-1203925161
Novochek
2008-02-25 10:39
2008.08.10
Не работает ХРАНИМАЯ ПРОЦЕДУРА


3-1203075136
Альберт
2008-02-15 14:32
2008.08.10
Нормализация информации


9-1172434704
Mr.Vlad
2007-02-25 23:18
2008.08.10
Изображение с прозрачным фоном


2-1215441846
lewka
2008-07-07 18:44
2008.08.10
16-ричный код палитры цветов ТColorDialog


6-1191841928
Elen
2007-10-08 15:12
2008.08.10
Закрыть подключение через NetFileClose





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский