Помогите пожалуйста с запсью/чтеньем XML!!!!

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

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

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

Сообщение qivi »

Maxizar
Спастбо
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

sign писал(а):
Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)
Согласен, что при этом может возникнуть путаница, если при составлении файла будет что-то перепутано. У меня есть программа для студентов, лабораторная работа, где исходные данные формирует преподаватель в виде текстового файла значений и пока что никаких проблем не возникало.

Суть в другом.
Суть форматов, таких как XML, JSON и других - самодокументируемость данных.

Добавлено спустя 5 минут 15 секунд:
qivi писал(а):
Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)


Сперва я использовал INI - просто и понятно, всё бы ничего, но возникли проблемы с многострочным полем, записывал он его всё, а вот считывал только первую строчку... можно было б конечно прикрутить какие ни будь педали заменяющие перенос каретки на какую нибудь комбинацию символов до записи в файл и обратно после чтения... но я просто выбрал XML.

В качестве очередного велосипеда, могу предложить делать первоначально проверку на наличие обязательных узлов в xml-файле и только после этого пытаться уже обрабатывать данный файл если он прошел проверку

Padre_Mortius, а как выглядит проверка наличия определённого узла в открытом XML файле? :oops:

Мой путь.
Но тут я удачно наткнулся на JSON.
Для вас - http://www.progdigy.com/?page_id=6

У меня при использовании этих модулей лазарь грешит на

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

TSuperObject = class;
  ISuperObject = interface;
  TSuperArray = class;
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

unit`ы Лазаруса
fpjson, jsonConf, jsonparser и т.д.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

а где можно найти пример с использованием? ^_^'
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

меня лично в поддержке формата json в fcl не устраивает то, что, собственно, когда программно генерируешь файл, а потом сохраняешь его, то там никаких отступов и переводов строк в нужных местах. И мне не понятно, почему. Всё, весь текст пишется в одну длинную строку. Хотя, аналогичный компонент для xml из fcl расставляет в аналогичной ситуации отступы и переводы строк правильно.

Хорошо, отступы ставятся

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

<CONFIG once_configured="True" ad2d_primary_lib="AndorraLib.dll">
  <display width="800" height="600" windowCaption="Overkill project"/>
  <redraw fps_limit="40" threadsleep="20"/>
</CONFIG>


Плохо!, отступы нифига не ставятся

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

{ "once_configured" : True, "ad2d_primary_lib" : "AndorraLib.dll", "display" : { "width" : 800, "height" : 600, "windowCaption" : "Overkill project" }, "redraw" : { "fps_limit" : 40, "threadsleep" : 20 } }
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Как узнать количество атрибутов узла чтоб перебрать их в цикле?

Если я не совсем ясно или грамотно изъясняюсь, то я вот об этих штуках:

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

XML_F2.ChildNodes.Item[0].ChildNodes.Item[0].Attributes


Добавлено спустя 18 минут 56 секунд:
Вроде нашёл:

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

XML_F2.ChildNodes.Item[0].ChildNodes.Item[0].Attributes.Length

Ожидал просто что то аналогичное определению количества дочерних узлов:

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

XML_F2.ChildNodes.Item[0].ChildNodes.Item[0].Attributes.Count
VinSS
новенький
Сообщения: 26
Зарегистрирован: 29.12.2011 04:23:46

Сообщение VinSS »

Возникла проблема с чтением, вроде и код использую из вики:

procedure TForm1.MenuItem4Click(Sender: TObject);
var
s:string;
PassNode: TDOMNode;
Doc: TXMLDocument;
begin
ReadXMLFile(Doc, '\servertypestype_1all_filesfile_00529759file529759.xml');
PassNode := Doc.DocumentElement.FindNode(number);
s:=UTF8Encode(PassNode.TextContent);
Doc.Free;
end;

но все время получаю "SIGSEGV" на s:=UTF8Encode(PassNode.TextContent). Что я только ни делал!
Проблема судя по всему в том, что кодировка юникод (<?xml version="1.0" encoding="unicode"?>).
Как побороть, что посоветуете?

Добавлено спустя 56 минут 55 секунд:
Если просто как текстовый файл читать, то квадраты вместо текста :(
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

VinSS писал(а):... но все время получаю "SIGSEGV" на s:=UTF8Encode(PassNode.TextContent). Что я только ни делал!
Проблема судя по всему в том, что кодировка юникод (<?xml version="1.0" encoding="unicode"?>).
Как побороть, что посоветуете?

Вот так пробовали?

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

procedure TForm1.MenuItem4Click(Sender: TObject);
var
s:string;
PassNode: TDOMNode;
Doc: TXMLDocument;
begin
ReadXMLFile(Doc, '\servertypestype_1all_filesfile_00529759file529759.xml');
PassNode := Doc.DocumentElement.FindNode(number);

if not (PassNode = nil) then //!!!!!!!!!!!!!!!!!!!!!!!!!

s:=UTF8Encode(PassNode.TextContent);
Doc.Free;
end;
VinSS
новенький
Сообщения: 26
Зарегистрирован: 29.12.2011 04:23:46

Сообщение VinSS »

Ага, теперь хотя бы ясно куда копать: PassNode = nil всегда. Почему не понятно :(
Node 'number' точно есть! Видимо надо 'number' тоже кодировать перед поиском, а как?

Добавлено спустя 24 минуты 14 секунд:
Положил xml в папку с экзешником, пересохранил его через блокнот в UTF-8 все равно не получается :(
Что я могу принципиально неправильное делать?
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

VinSS писал(а):...
Что я могу принципиально неправильное делать?

Да что угодно. :D
XML-ину в студию. :wink:
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

VinSS писал(а):Что я могу принципиально неправильное делать?

Например, DocumentElement.FindNode не рекурсивна и ищет только по "детям", а не по "внукам" и "правнукам".
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

VinSS писал(а):Что я могу принципиально неправильное делать?

например ошибаться в имени файла...

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

try
  ReadXMLFile(f, FileName);
  ...
except
  ShowMessage('Я указал неправильное имя файла ;)');
end;
VinSS
новенький
Сообщения: 26
Зарегистрирован: 29.12.2011 04:23:46

Сообщение VinSS »

dunin писал(а):XML-ину в студию.

Обрезал xml по максимому, в нем просто несколько страниц и кучи данных на них.
<?xml version="1.0" encoding="unicode"?>
<batch version="1.0" hasBlockCoordinates="true">
<page pageNumber="1" pageTemplate="v1-2">
<block blockName="SURNAME" l="110" t="521" r="1193" b="607">ИВАНОВ</block>
<block blockName="NAME" l="110" t="609" r="1195" b="695">ИВАН</block>
<block blockName="PTRNMIC_NAME" l="111" t="696" r="1196" b="782">ИВАНОВИЧ</block>
<block blockName="DOB" l="282" t="793" r="865" b="873">01.01.1950</block>
<block blockName="CITIZENSHIP" l="0" t="0" r="0" b="0">RU</block>
</page>
</batch>


v-t-l писал(а):Например, DocumentElement.FindNode не рекурсивна и ищет только по "детям", а не по "внукам" и "правнукам".

Чувствую истина где-то рядом!


leo_bsv писал(а):например ошибаться в имени файла...

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

Сообщение leo_bsv »

VinSS писал(а):Обрезал xml по максимому, в нем просто несколько страниц и кучи данных на них.
<?xml version="1.0" encoding="unicode"?>

атрибут encoding="unicode" не обязателен.

Добавлено спустя 13 минут 4 секунды:
VinSS писал(а):s:=UTF8Encode(PassNode.TextContent);

Текст из ноды читается таким кодом:

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

s := PassNode.FirstChild.NodeValue;
Ответить