|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Загрузка 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
|
|||
|
|||
Походу, в TXMLDocument используется какая-то "старая" имплементация парсера. Новый парсер от МС все читает нормально. Так что тут всего 2 варианта:
1. Мы знаем, на чем он "ломается" - там линия из дефисов, она ему и не нравится. Так что перед загрузкой просто меняем ее на что-нить другое. Если эта линия так важна, то при сохранении меняем обратно. Т.е. читаем файл как текст, меняем линию на что-нить другое, потом создает TStringStream и читаем xml из него; при сохранении делаем все в обратном порядке - xml сохраняем в TStringStream, потом в полученной строке меняем нашу закладку обратно на линию дефисов и уже полученный результат сохрняем в файл. 2. Ищем более подходящий парсер - менее разборчивый. Ну или пользуемся микрософтовским, только самым последним, без дельфиной обертки. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
AnatoliK (11.09.2017)
|
#3
|
|||
|
|||
Спасибо за ответ.
Пока попробую заменить проблемные строчки, на те которые устраивают Delphi. Если, что тему не закрывайте, т.к. возможны еще какие-то подводные камни впереди по этому проекту. Или лучше новую тему создать? |
#4
|
|||
|
|||
Зависит, если новый вопрос будет про те же проблеммы с xml, то сюда, если что-то новое - то в новую тему.
|
#5
|
|||
|
|||
Спасибо за помощь. Решил свою проблему 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; |