Имя: Пароль:
IT
 
Не могу прочитать XML-документ в DELPHI
0 Kseniya_
 
30.07.16
10:21
Здравствуйте!
Уже раз 20 пробовала прочитать xml-документ в делфи - не получается. Не могу понять, в чем проблема. Создать xml-документ получилось, но прочитать из него не получается. Помогите, пожалуйста!

Вот код сохранения:
var
  Xml: IXMLDocument;
begin
    Xml := TXMLDocument.Create (nil);
    Xml.Active := true;
    with Xml do
      begin
        with AddChild('Config') do
          begin
            with AddChild('User') do
              begin
                 ChildValues['Id'] := 1;
                 ChildValues['Name'] := 'ddd';
                 ChildValues['Status'] := 'Developer';
              end;
          end;
      end;
     Xml.SaveToFile(ExtractFilePath(Application.ExeName) + 'In.xml');
     Xml.Active := false;

Вот код чтения:

var
  Xml: IXMLDocument;
begin
  try
    XML := TXMLDocument.Create(nil);
    Xml.LoadFromFile(ExtractFilePath(Application.ExeName) + 'In.xml');
    Xml.Active := true;

    edit1.Text := VarToStr(Xml.DocumentElement.ChildNodes[0].ChildNodes['User'].ChildNodes['Id'].text);
1 Kseniya_
 
30.07.16
10:22
Сохраняет вот так: <Config><User><Id>1</Id><Name>ddd</Name><Status>Developer</Status></User></Config>
2 Горогуля
 
30.07.16
10:43
(1) можно я ни черта в дельфийском коде не понял и не увидео объявление xml? положено бывать
3 Kseniya_
 
30.07.16
10:55
var
  Xml: IXMLDocument;  - объявление документа xml
uses
  ... ComCtrls, XMLDoc, XMLIntf, xmldom;
4 H A D G E H O G s
 
30.07.16
10:56
Страдай.
5 H A D G E H O G s
 
30.07.16
10:58
Я это один раз победил через кровь и пот, когда встречусь второй раз - изучу xml data provider
6 Горогуля
 
30.07.16
10:58
(3) вар - это объявление переменной. в 1Ске говорят ЗаписатьОбъявлениеXML. от этого получается что-то в духе <?xml version="1.0" encoding="UTF-8"?> и всё такое. короче, выдаётся валидный документ. читай про валидность
7 H A D G E H O G s
 
30.07.16
11:00
(6) Дельфи похер на объявление
8 Горогуля
 
30.07.16
11:01
(7) ээ.. а как они с этим живут?
9 Горогуля
 
30.07.16
11:05
коллеги, напомните про валидность хмл. бывает вон такое незакрывающееся объявление, а потом один(один!) корневой узел со всякими прочими рюшками. мож, я где-то перепохмелился ;)
10 H A D G E H O G s
 
30.07.16
11:06
Считают если заголовка нет - то он дефолтнный
11 H A D G E H O G s
 
30.07.16
11:06
12 Горогуля
 
30.07.16
11:07
(10) щас ветку найду. у товарища сервер не принимал с заголовокм
13 Горогуля
 
30.07.16
11:10
+(12) ну и как бы это..хмл без заголовка - текстовый документ с кучей тэгов
14 Горогуля
 
30.07.16
11:11
(12) вот она: Запись XML
15 Kseniya_
 
30.07.16
11:31
Всем Спасибо! Все получилось!
Я, кажется, указывала лишний корень при обращении к элементу при чтении!

ВОт запись:

var
  Node: IXMLNode;
  Xml: IXMLDocument;
begin
  try
    Xml :=  NewXMLDocument();
    //Xml.Version := '1.0';
    Xml.Encoding := 'utf-8';
    Xml.Active := true;
    // ???????

    Node := Xml.AddChild('Main');
    Node.Attributes ['arr1'] := '111';
    Node.Attributes ['arr2'] := '222';
    Node.Attributes ['arr3'] := '333';

    Xml.SaveToFile('C:/input.xml');//ExtractFilePath(Application.ExeName) + 'In.xml');
    Xml.Active := false;


Вот чтение:

var
  Xml: IXMLDocument;
begin
  //?????? xml
  try
    XML := NewXMLDocument();
    Xml.Active := true;
    Xml.LoadFromFile('C:/input.xml');//ExtractFilePath(Application.ExeName) + 'In.xml');
    edit1.Text := VarToStr(Xml.DocumentElement.Attributes['arr1']); {??? ?? ??????? ??????}
    Xml.Active := false;
16 Горогуля
 
30.07.16
11:34
(15) >edit1.Text := VarToStr(Xml.DocumentElement.Attributes['arr1']); {??? ?? ??????? ??????}
что за едит1? ну помогло и помогло. на здоровье
17 Kseniya_
 
30.07.16
11:44
(16) Это текстовое поле просто временное для того, чтобы посмотреть, что прочиталось.
18 Горогуля
 
30.07.16
11:49
>Xml.DocumentElement.Attributes['arr1']
как-то не вижу "лишний корень при обращении к элементу при чтении". спишем на близорукость. чего было-то?
19 Kseniya_
 
30.07.16
13:03
(18) Я делала так, лишнее ChildNodes все время добавляла, думала, что нужно Xml.DocumentElement.ChildNodes['main'].Attributes['d1'])
20 Garykom
 
гуру
30.07.16
13:49
ExtractFilePath(Application.ExeName) + "\" + 'In.xml'
21 Garykom
 
гуру
30.07.16
13:50
(20)+ Точнее лучше сделать проверку на последний символ ExtractFilePath(Application.ExeName) и если <>"\" тогда добавляем
22 Kseniya_
 
30.07.16
16:12
(21) ExtractFilePath(Application.ExeName) в делфи всегда прибавляет этот символ "\"
23 Garykom
 
гуру
30.07.16
16:37
(22) Я тоже когда то так думал ))
24 Garykom
 
гуру
30.07.16
16:41
(23)+ Но это мелочи что легко перепутать с ExtractFileDir, есть другая проблема иногда багов работы разных "дельфи" под разными ОСями.
25 NorthWind
 
30.07.16
19:25
(5) да ладно, где там особый кровь и пот... вроде нормально и читал и писал. Головная боль там начинается, когда хочешь использовать xpath - очень непрозрачное использование запросов. А так ничо
26 H A D G E H O G s
 
05.08.16
20:50
Я изучил Data Binder.
Работать с XML в Дельфи с DB еще проще, чем в 1С с его XDTO.