Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.09.2017, 01:22
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
Вопрос Загрузка XML (Ошибочный синтаксис)

Здравствуйте уважаемые знатоки.

Пришла в голову идея по созданию программы, которая будет редактировать xml файл с настройками модификации для одной не безызвестной на данный момент игрушки. Также в ней должна присутствовать возможность воспроизведения звуковых файлов.

Так как модификация в какой-то степени обширная, она разделена на компоненты. У каждого компонента свой xml файл. Каких-то специализированных знаний по программированию не имею. Начал потихоньку делать пользуясь гуглом и собрал программу для настройки одного xml файла. 2 радиобаттона, 4 комбобокса, 4 медиаплеера, 2 обычных кнопки, несколько надписей, пара картинок и проект готов. Код стремный показывать кому-либо даже стыдно. Но все работает и вроде без замечаний.

Дальше думал, что раз получилось слепить один настройщик другие пойдут как на конвейере, но что-то пошло не так. При попытке загрузить xml файл для дальнейшей работы с ним Delphi выдает ошибку.

error.jpg

Начал гуглить и в конце концов вычитал, что "Комментарий начинается последовательностью «<!--» и заканчивается последовательностью «-->», внутри не может встречаться комбинация символов «--»".

Ссылка на источник https://ru.wikipedia.org/wiki/XML#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.87.D0.B0.D0. BD.D0.B8.D1.8F

Теперь собственно несколько вопросов Вам:
Можно-ли как-то обойти данную ошибку?
Можно-ли открыть данный файл не как xml и изменить в нем данную строку на ту, которая не вызовет эту ошибку? (то есть поменять - на =)

Вот мой код для загрузки xml файла:

Код:
procedure TForm1.FormCreate(Sender: TObject);

begin
      if FileExists('..\mods\configs\RTCS\rtcs_buzzer.xml') then
      begin
      XML:=TXMLDocument.Create(Self);
      XML.LoadFromFile('..\mods\configs\RTCS\rtcs_buzzer.xml');
      XML.Active:=true;
      StatusMain:= XML.DocumentElement.ChildNodes[2].ChildNodes[0].Text;

            if AnsiCompareText(StatusMain,'true') = 0 then
                  RadioButton1.Checked:=True;
            if AnsiCompareText(StatusMain,'false') = 0 then
                  RadioButton2.Checked:=True;

      XML.Active:=false;
      end
      else
      begin
      Application.Title := '';
      ShowMessage('Файл с настройками модификации не обнаружен, проверьте правильность установки модификации!');
      end;
end;

Также прилагаю сам файл xml и прошу сильно не ругаться на кривоту кода.
rtcs_buzzer.rar
Не получилось загрузить xml на форум без архива. Загрузчик ругался и писал, что некорректный файл.

Закинул картинкой для тех кто думает, что в архиве вирусы
xml.png
Ответить с цитированием
  #2  
Старый 11.09.2017, 06:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Походу, в TXMLDocument используется какая-то "старая" имплементация парсера. Новый парсер от МС все читает нормально. Так что тут всего 2 варианта:
1. Мы знаем, на чем он "ломается" - там линия из дефисов, она ему и не нравится. Так что перед загрузкой просто меняем ее на что-нить другое. Если эта линия так важна, то при сохранении меняем обратно. Т.е. читаем файл как текст, меняем линию на что-нить другое, потом создает TStringStream и читаем xml из него; при сохранении делаем все в обратном порядке - xml сохраняем в TStringStream, потом в полученной строке меняем нашу закладку обратно на линию дефисов и уже полученный результат сохрняем в файл.
2. Ищем более подходящий парсер - менее разборчивый. Ну или пользуемся микрософтовским, только самым последним, без дельфиной обертки.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
AnatoliK (11.09.2017)
  #3  
Старый 11.09.2017, 22:19
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Спасибо за ответ.
Пока попробую заменить проблемные строчки, на те которые устраивают Delphi.
Если, что тему не закрывайте, т.к. возможны еще какие-то подводные камни впереди по этому проекту. Или лучше новую тему создать?
Ответить с цитированием
  #4  
Старый 11.09.2017, 23:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Зависит, если новый вопрос будет про те же проблеммы с xml, то сюда, если что-то новое - то в новую тему.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо lmikle за это полезное сообщение:
Alegun (11.09.2017), AnatoliK (12.09.2017)
  #5  
Старый 12.09.2017, 19:17
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Спасибо за помощь. Решил свою проблему 1ым Вами предложенным способом.

Код:
begin
      if FileExists('..\mods\configs\RTCS\rtcs_buzzer.xml') then
      begin
      AssignFile (T, '..\mods\configs\RTCS\rtcs_buzzer.xml');
      Reset(T);

            while (not EOF(T)) do begin
            Readln(T, s);
            Memo1.Lines.Add(s);
            end;

      Memo1.Text:=StringReplace(Memo1.Text, '------------------------------------------------------------------------------','==============================================================================' , [rfReplaceAll]);
      CloseFile (T);
      Memo1.Lines.SaveToFile('..\mods\configs\RTCS\rtcs_buzzer.xml');

      XML:=TXMLDocument.Create(Self);
      XML.LoadFromFile('..\mods\configs\RTCS\rtcs_buzzer.xml');
      XML.Active:=true;
      StatusMain:= XML.DocumentElement.ChildNodes[2].ChildNodes[0].Text;

            if AnsiCompareText(StatusMain,'true') = 0 then
                  RadioButton1.Checked:=True;
            if AnsiCompareText(StatusMain,'false') = 0 then
                  RadioButton2.Checked:=True;

      XML.Active:=false;
      end
      else
      begin
      Application.Title:='';
      ShowMessage('Файл с настройками модификации не обнаружен, проверьте правильность установки модификации!');
      end;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter