Помогите пожалуйста с запсью/чтеньем XML!!!!
Модератор: Модераторы
Maxizar
Спастбо
Спастбо
- BadBoyAlex
- постоялец
- Сообщения: 119
- Зарегистрирован: 08.06.2010 12:42:23
- Откуда: Россия, Белгород
- Контактная информация:
sign писал(а):Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений.
Согласен, что при этом может возникнуть путаница, если при составлении файла будет что-то перепутано. У меня есть программа для студентов, лабораторная работа, где исходные данные формирует преподаватель в виде текстового файла значений и пока что никаких проблем не возникало.
Суть в другом.
Суть форматов, таких как XML, JSON и других - самодокументируемость данных.
Добавлено спустя 5 минут 15 секунд:qivi писал(а):Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений.
Сперва я использовал INI - просто и понятно, всё бы ничего, но возникли проблемы с многострочным полем, записывал он его всё, а вот считывал только первую строчку... можно было б конечно прикрутить какие ни будь педали заменяющие перенос каретки на какую нибудь комбинацию символов до записи в файл и обратно после чтения... но я просто выбрал XML.В качестве очередного велосипеда, могу предложить делать первоначально проверку на наличие обязательных узлов в xml-файле и только после этого пытаться уже обрабатывать данный файл если он прошел проверку
Padre_Mortius, а как выглядит проверка наличия определённого узла в открытом XML файле?
Мой путь.
Но тут я удачно наткнулся на JSON.
Для вас - http://www.progdigy.com/?page_id=6
У меня при использовании этих модулей лазарь грешит на
Код: Выделить всё
TSuperObject = class;
ISuperObject = interface;
TSuperArray = class;unit`ы Лазаруса
fpjson, jsonConf, jsonparser и т.д.
fpjson, jsonConf, jsonparser и т.д.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
а где можно найти пример с использованием? ^_^'
меня лично в поддержке формата 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 } }
Как узнать количество атрибутов узла чтоб перебрать их в цикле?
Если я не совсем ясно или грамотно изъясняюсь, то я вот об этих штуках:
Добавлено спустя 18 минут 56 секунд:
Вроде нашёл:
Ожидал просто что то аналогичное определению количества дочерних узлов:
Если я не совсем ясно или грамотно изъясняюсь, то я вот об этих штуках:
Код: Выделить всё
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Возникла проблема с чтением, вроде и код использую из вики:
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 секунд:
Если просто как текстовый файл читать, то квадраты вместо текста
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
- Откуда: Тољя††и
- Контактная информация:
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;
Ага, теперь хотя бы ясно куда копать: PassNode = nil всегда. Почему не понятно 
Node 'number' точно есть! Видимо надо 'number' тоже кодировать перед поиском, а как?
Добавлено спустя 24 минуты 14 секунд:
Положил xml в папку с экзешником, пересохранил его через блокнот в UTF-8 все равно не получается
Что я могу принципиально неправильное делать?
Node 'number' точно есть! Видимо надо 'number' тоже кодировать перед поиском, а как?
Добавлено спустя 24 минуты 14 секунд:
Положил xml в папку с экзешником, пересохранил его через блокнот в UTF-8 все равно не получается
Что я могу принципиально неправильное делать?
VinSS писал(а):Что я могу принципиально неправильное делать?
Например, DocumentElement.FindNode не рекурсивна и ищет только по "детям", а не по "внукам" и "правнукам".
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
VinSS писал(а):Что я могу принципиально неправильное делать?
например ошибаться в имени файла...
Код: Выделить всё
try
ReadXMLFile(f, FileName);
...
except
ShowMessage('Я указал неправильное имя файла ;)');
end;
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
- Откуда: Йошкар-Ола
- Контактная информация:
VinSS писал(а):Обрезал xml по максимому, в нем просто несколько страниц и кучи данных на них.
<?xml version="1.0" encoding="unicode"?>
атрибут encoding="unicode" не обязателен.
Добавлено спустя 13 минут 4 секунды:
VinSS писал(а):s:=UTF8Encode(PassNode.TextContent);
Текст из ноды читается таким кодом:
Код: Выделить всё
s := PassNode.FirstChild.NodeValue;