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

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

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

Ответить
n0th1ng
новенький
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

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

Сообщение n0th1ng »

Код: Выделить всё

      
  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"/>
Как это сделать? По какому принципу сортируются атрибуты?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

XML не предусматривает возможности управлять порядком атрибутов.
n0th1ng
новенький
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Сообщение n0th1ng »

Это почему же? В TinyXML например, атрибуты идут по порядку добавления. Наверно и тут можно как-то сортировать по хитрому. Или может есть какие-нибудь другие компоненты для работы с xml?
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

XML не для удобства чтения человеком. Это формат обмена данными между программами.
Для XSLT преобразования, пожалуй, важен порядок формирования XML. Особенно если формируем
таблицу. А так... Смысла особого нет. Как сформируешь XML так он и будет. Сортировка DOM фигня какая-то :wink:
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Порядок элементов важен, он соблюдается и сохраняется.
А порядок атрибутов может быть любым. Кроме того, как в процессе чтения, так и в процессе записи атрибуты могут добавляться, удаляться, и у них могут меняться префиксы. Единственное исключение - канонический формат, там атрибуты (упрощенно говоря) сортируются по возрастанию кодов символов в имени.
Это поведение описано в спецификации XML. Eсли какой-то компонент позволяет управлять порядком атрибутов - это не нарушает спецификации, но тем не менее является особенностью реализации этого компонента, а не стандартным поведением.
n0th1ng
новенький
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Сообщение n0th1ng »

Ну это понятно что машине все равно в каком порядке стоят атрибуты. Это нужно чтобы потом человек мог легко разобраться в xml и если нужно будет убрать/редактировать/добавить строки прямо в xml. Например убрали какую то текстуру или переименовали название - прошелся по name и вуаля!
Наверно придется все-таки самому написать...
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

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

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

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

Сообщение n0th1ng »

Тогда такой вопрос - можно ли немного отредактировать стандартный парсер лазаруса? А то он какой-то не такой - криво сохраняет и не понимает некоторые символы... Да сортировку атрибутов надо бы сделать по схеме "первым добавил - первым записал". Или есть альтернативные парсеры XML?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Какие именно символы он не понимает и криво сохраняет?
n0th1ng
новенький
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Сообщение n0th1ng »

Точнее ругается на такие штуки

Код: Выделить всё

<!--comment>-->  
&#x19;
--blahblah>

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

А при открытии и сохранении извращает луа-скрипты:

Код: Выделить всё

<node>
        DoSomeThing1(arg);
        DoSomeThing2(arg);
</node>

превращает в:

Код: Выделить всё

<node>DoSomeThing1(arg);
                     DoSomeThing2(arg);
             </node>
хотя наверно так и должно быть...
про сортировку аттрибутов я уже говорил.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Символы с кодами меньше 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 в секции "Пробельные символы".
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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

Есть, например SimpleXML.
Но при всём том, что он "Simple", он медленнее чем штатный парсер из fcl-xml. Sergei I. Gorelkin хорошо оптимизировал fcl-xml, за что ему большое спасибо (пользуясь случаем).
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Да перебери ты свои атрибуты в цикле отбери по порядку нужные проверяя их по имени узла атрибута
n0th1ng
новенький
Сообщения: 12
Зарегистрирован: 21.11.2011 09:52:27

Сообщение n0th1ng »

OK, всем спасибо! Еще один вопрос:

Код: Выделить всё

<?xml version="1.0"?>
<!DOCTYPE sequence SYSTEM "sidewalkdtd">
<sequence name="anim.xml" source="anim.png">
   <child1>
      <child2/>
   </child1>
...
</sequence>

не читает чилды sequence'а, а если убрать строку <!DOCTYPE> то все ОК. Для чего нужен этот DOCTYPE и как его игнорировать?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

DOCTYPE содержит описание структуры документа, которую парсер может контролировать на соответствие. Но чтобы документ с DTD именно *не читался*, нужно во-первых, установить Options.Validate=True, во-вторых, написать обработчик ошибок, в-третьих, в этом обработчике кидать исключение в случае ошибок валидации. Пример есть опять же в вики http://wiki.freepascal.org/XML_Tutorial/ru . В противном случае DTD игнорируется (при условии, что само DTD синтаксически правильно).
Ответить