Сортировка атрибутов в XML.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сортировка атрибутов в XML.

Сообщение n0th1ng » 21.11.2011 10:13:21

Код: Выделить всё
     
  xdoc := TXMLDocument.create;

  RootNode := xdoc.CreateElement('scene');
  Xdoc.Appendchild(RootNode);     

  PicsNode:= xdoc.CreateElement('pics');
  RootNode.AppendChild(PicsNode);
  for i:=0 to mPicSize-1 do
  begin
      picNode := xdoc.CreateElement('pic');
      TDOMElement(picNode).SetAttribute('name', mName[i]);     
      TDOMElement(picNode).SetAttribute('tex',  mTex[i]);
      TDOMElement(picNode).SetAttribute('x',IntToStr(x[i]));
      TDOMElement(picNode).SetAttribute('y',IntToStr(y[i]));
      PicsNode.Appendchild(picNode);
  end;
writeXMLFile(xDoc,'output.xml');
Xdoc.free;   

В xml выводит так:
<pic x="0" y="0" tex="pic1.tex" name="pic1.pic"/>
а нужно так(для удобочитаемости):
<pic name="pic1.pic" tex="pic1.tex" x="0" y="0"/>
Как это сделать? По какому принципу сортируются атрибуты?
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение Sergei I. Gorelkin » 21.11.2011 11:05:56

XML не предусматривает возможности управлять порядком атрибутов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сортировка атрибутов в XML.

Сообщение n0th1ng » 22.11.2011 03:21:55

Это почему же? В TinyXML например, атрибуты идут по порядку добавления. Наверно и тут можно как-то сортировать по хитрому. Или может есть какие-нибудь другие компоненты для работы с xml?
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение vada » 22.11.2011 10:09:34

XML не для удобства чтения человеком. Это формат обмена данными между программами.
Для XSLT преобразования, пожалуй, важен порядок формирования XML. Особенно если формируем
таблицу. А так... Смысла особого нет. Как сформируешь XML так он и будет. Сортировка DOM фигня какая-то :wink:
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Сортировка атрибутов в XML.

Сообщение Sergei I. Gorelkin » 22.11.2011 11:03:54

Порядок элементов важен, он соблюдается и сохраняется.
А порядок атрибутов может быть любым. Кроме того, как в процессе чтения, так и в процессе записи атрибуты могут добавляться, удаляться, и у них могут меняться префиксы. Единственное исключение - канонический формат, там атрибуты (упрощенно говоря) сортируются по возрастанию кодов символов в имени.
Это поведение описано в спецификации XML. Eсли какой-то компонент позволяет управлять порядком атрибутов - это не нарушает спецификации, но тем не менее является особенностью реализации этого компонента, а не стандартным поведением.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сортировка атрибутов в XML.

Сообщение n0th1ng » 22.11.2011 11:52:02

Ну это понятно что машине все равно в каком порядке стоят атрибуты. Это нужно чтобы потом человек мог легко разобраться в xml и если нужно будет убрать/редактировать/добавить строки прямо в xml. Например убрали какую то текстуру или переименовали название - прошелся по name и вуаля!
Наверно придется все-таки самому написать...
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение leo_bsv » 24.11.2011 23:43:34

Sergei I. Gorelkin писал(а):Порядок элементов важен, он соблюдается и сохраняется.
А порядок атрибутов может быть любым.

Точно.
n0th1ng писал(а):Наверно придется все-таки самому написать...

Программный перебор атрибутов - дело не хитрое... зачем же их раскладывать в определённом порядке для человека:?:
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Сортировка атрибутов в XML.

Сообщение n0th1ng » 25.01.2012 11:00:58

Тогда такой вопрос - можно ли немного отредактировать стандартный парсер лазаруса? А то он какой-то не такой - криво сохраняет и не понимает некоторые символы... Да сортировку атрибутов надо бы сделать по схеме "первым добавил - первым записал". Или есть альтернативные парсеры XML?
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение Sergei I. Gorelkin » 25.01.2012 11:22:45

Какие именно символы он не понимает и криво сохраняет?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сортировка атрибутов в XML.

Сообщение n0th1ng » 27.01.2012 11:33:18

Точнее ругается на такие штуки
Код: Выделить всё
<!--comment>--> 
&#x19;
--blahblah>

TinyXml например проглатывает их.

А при открытии и сохранении извращает луа-скрипты:
Код: Выделить всё
<node>
        DoSomeThing1(arg);
        DoSomeThing2(arg);
</node>

превращает в:
Код: Выделить всё
<node>DoSomeThing1(arg);
                     DoSomeThing2(arg);
             </node>
хотя наверно так и должно быть...
про сортировку аттрибутов я уже говорил.
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение Sergei I. Gorelkin » 27.01.2012 13:00:16

Символы с кодами меньше 32, за исключением 9, 10 и 13, в xml 1.0 запрещены, в том числе и в виде &#00. То, что TinyXml их разрешает - баг самого TinyXml.
Но, в xml 1.1 они разрешены, и при наличии у файла заголовка с версией 1.1 парсер их съест.
Чтобы не корявил пробелы, нужно парсить с Options.PreserveWhitespace:=True. См. http://wiki.freepascal.org/XML_Tutorial/ru в секции "Пробельные символы".
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сортировка атрибутов в XML.

Сообщение Odyssey » 27.01.2012 20:37:35

n0th1ng писал(а):Или есть альтернативные парсеры XML?

Есть, например SimpleXML.
Но при всём том, что он "Simple", он медленнее чем штатный парсер из fcl-xml. Sergei I. Gorelkin хорошо оптимизировал fcl-xml, за что ему большое спасибо (пользуясь случаем).
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Сортировка атрибутов в XML.

Сообщение qivi » 29.01.2012 19:39:16

Да перебери ты свои атрибуты в цикле отбери по порядку нужные проверяя их по имени узла атрибута
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Сортировка атрибутов в XML.

Сообщение n0th1ng » 02.02.2012 09:55:06

OK, всем спасибо! Еще один вопрос:
Код: Выделить всё
<?xml version="1.0"?>
<!DOCTYPE sequence SYSTEM "sidewalkdtd">
<sequence name="anim.xml" source="anim.png">
   <child1>
      <child2/>
   </child1>
...
</sequence>

не читает чилды sequence'а, а если убрать строку <!DOCTYPE> то все ОК. Для чего нужен этот DOCTYPE и как его игнорировать?
n0th1ng
новенький
 
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Re: Сортировка атрибутов в XML.

Сообщение Sergei I. Gorelkin » 02.02.2012 11:09:31

DOCTYPE содержит описание структуры документа, которую парсер может контролировать на соответствие. Но чтобы документ с DTD именно *не читался*, нужно во-первых, установить Options.Validate=True, во-вторых, написать обработчик ошибок, в-третьих, в этом обработчике кидать исключение в случае ошибок валидации. Пример есть опять же в вики http://wiki.freepascal.org/XML_Tutorial/ru . В противном случае DTD игнорируется (при условии, что само DTD синтаксически правильно).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 189

Рейтинг@Mail.ru