• 0
dim

Парсинг XML файла

Вопросы

подскажите чем можно парсить xml?

пробовал XMLDocument

  XMLDocument1.LoadFromXML(strXml);
  XMLDocument1.Active := True;
но он при загрузке файла выдает ошибку

"Ошибка в элементе верхнего уровня документа

Line:1"

этот файл мне приходит от поставщика и при открытии другими программами не ругается на структуру

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 ответов на этот вопрос

  • 0

Ну так быстрее будет проверять и удалять эту ошибочную строку через StringList, чем искать что-то другое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

а как определить в чем ошибка, внешне вроде все нормально

<?xml version="1.0" encoding="UTF-8"?>
<CIM CIMVERSION="2.0" DTDVERSION="2.2">
  <DECLARATION>
    <DECLGROUP>
      <VALUE.OBJECT>
        <INSTANCE CLASSNAME="NEW">
          <PROPERTY_1 TYPE="string" NAME="ID">
            <VALUE>1</VALUE>
          </PROPERTY_1>
          <PROPERTY_2 TYPE="string" NAME="СБ_ID">
            <VALUE>SD100000001</VALUE>
          </PROPERTY_2>
          <PROPERTY_4 TYPE="string" NAME="ИНФОРМАЦИЯ">
            <VALUE>Шаблон::</VALUE>
          </PROPERTY_4>
          <PROPERTY_5 TYPE="string" NAME="ИНИЦИАТОР">
            <VALUE>Сергей Николаевич</VALUE>
          </PROPERTY_5>
          <PROPERTY_6 TYPE="string" NAME="РГ">
            <VALUE>для сотрудников</VALUE>
          </PROPERTY_6>
          <PROPERTY_7 TYPE="string" NAME="ПБ">
            <VALUE>42</VALUE>
          </PROPERTY_7>
        </INSTANCE>
      </VALUE.OBJECT>
      <VALUE.OBJECT>
        <INSTANCE CLASSNAME="NEW">
          <PROPERTY_1 TYPE="string" NAME="ID">
            <VALUE>2</VALUE>
          </PROPERTY_1>
          <PROPERTY_2 TYPE="string" NAME="СБ_ID">
            <VALUE>SD100000002</VALUE>
          </PROPERTY_2>
          <PROPERTY_4 TYPE="string" NAME="ИНФОРМАЦИЯ">
            <VALUE>Шаблон::</VALUE>
          </PROPERTY_4>
          <PROPERTY_5 TYPE="string" NAME="ИНИЦИАТОР">
            <VALUE>Сергей Николаевич</VALUE>
          </PROPERTY_5>
          <PROPERTY_6 TYPE="string" NAME="РГ">
            <VALUE>для сотрудников</VALUE>
          </PROPERTY_6>
          <PROPERTY_7 TYPE="string" NAME="ПБ">
            <VALUE>42</VALUE>
          </PROPERTY_7>
        </INSTANCE>
      </VALUE.OBJECT>
       </DECLGROUP>
  </DECLARATION>
</CIM>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
20 минут назад, dim сказал:

No errors were found 

Ну тогда все хорошо! Ищите ошибку в загрузчике!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

пользуюсь стандартным компонентом XMLDocument и стразу при загрузке ошибка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ошибка у тебя. Пошагово пройдись по своему коду, погляди на какой именно строчке у тебя что.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Стандартные парсеры что xml, что json от эмбы абсурдно усложнены, не стабильны и постоянно плюются эксепшенами. Лучше использовать что-то стороннее, нормальное. На гитхабе полно реализаций.  
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Что-то такое попробуй. У тебя ошибка с самого начала, где-то что-то не так написал. А еще вероятно буковки русские не прокатывают

    IXMLNode *XMLDoc = XML->DocumentElement;
    IXMLNode *Node = XMLDoc->ChildNodes->FindNode("commands");
    IXMLNode *n;

    if (Node)
    {
        Node = Node->ChildNodes->FindNode("command");
        if (Node)
        {
            String cmd = Node->GetAttribute("name");
            if (cmd == "Global Params")
            {
                for (int i = 0; i < Node->ChildNodes->Count; i++)
                {
                    n = Node->ChildNodes->Nodes[i];

                    if (n->NodeName == "...")
                    {
                        ... n->GetAttribute(".....");
                    }
                }
            }
        }
    }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да и посмотрите на непечатоемые символы в том же n++ 

Ну или файл поставщика скиньте, в том виде, что приходит, без копирования-вставки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, dim сказал:

пользуюсь стандартным компонентом XMLDocument и стразу при загрузке ошибка

Скорее всего ошибка в кодировке. Посмотрите, в компоненте нужно четко указывать кодировку поставляемого документа. И будет вам счастье.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

XMLDocument1.LoadFromXML(strXml);
  XMLDocument1.Active := True;<== Вот тут и ошибка

я пробовал и создавать новый файл (скопировав с оригинала) и символы смотрел уже все нормально

но так как файл приходит автоматом и загрузка должна быть без участия пользователя хотелось бы что бы нормально грузило (php ее грузит)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В дебаге вы не увидите разницы между Ansi кодировкой и UTF-8. Вам нужно убедиться, что в StrXML скорее всего юникод, а в XMLDocument1 скорее всего анси.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

сделал через

  ls:=TStringList.Create;
  ls.LoadFromFile(strXml);

  XMLDocument1.XML:=ls;
все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

если ls.loadFromFile то StrXML это имя файла а не XML

где-то обман

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

в смысле обман? я гружу файл в StringList, а потом его помещаю в XML

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

еще раз. вы показали код ls.LoadFromFile(strXML); 

но в этом случае strXML - это ИМЯ xml-файла

а в первом посте XMLDocument1.LoadFromXML(strXml); тут предполагается что strXML - это СОДЕРЖИМОЕ XML-файла

так что же там в strXML ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ups, блин убил пару дней

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Сам долго парился с этой проблемой в итоге - перевел в json. 

парсинг json : 

  type
    Treqmatr = Record
    matr : array of array of string;
    i:integer;
    j:integer;
  end;

function TForm1.request(req: string): TStringList;
var s:Tstringlist;
var MultiData:TIdMultiPartFormDataStream;
begin
 s:=TStringList.Create;
  jsonStream:=TMemoryStream.Create;
 IdHTTP1.Get(req,jsonStream);
  jsonstream.SaveToFile(filepath+'/'+req+'.txt'); // 
   s.LoadFromFile(filepath+'/'+req+'.txt',TEncoding.UTF8);
   Result:=s;
end;

 

function TForm1.parsereq(req:string): Treqmatr;
var
  RootNode: IXMLNode;
  s:Tstringlist;
  LJsonArr   : TJSONArray;
  LJsonValue : TJSONValue;
  LItem     : TJSONValue;
  s1,kodrazd:string;
  ich,jch,i1,j1,i2,j2:integer;
  matr:Treqmatr;
begin
   ich:=0;
   jch:=0;
  LJsonArr    := TJSONObject.ParseJSONValue(request(req).Text) as TJSONArray;
  for LJsonValue in LJsonArr do
   begin
      for LItem in TJSONArray(LJsonValue) do begin
         ich:=LJsonArr.Count;
         jch:=TJSONArray(LJsonValue).Count;
      end;
   end;
   SetLength(matr.matr,ich,jch);
   matr.i:=ich; matr.j:=jch;
   i1:=0;
    for LJsonValue in LJsonArr do begin
    j1:=0;
    if i1>ich then i1:=0;
      for LItem in TJSONArray(LJsonValue) do begin
     // if TJSONPair(LItem).JsonValue <>  nil then //надо проверить на ноль
        matr.matr[i1][j1]:=TJSONPair(LItem).JsonValue.Value;
       j1:=j1+1;
      end;
      i1:=i1+1;
   end;

   Result:=matr;
end;

Вызов:

var matr:Treqmatr;

try
matr:=parsereq('addres'); except end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 29.03.2018 в 17:24, Akad сказал:

Стандартные парсеры что xml, что json от эмбы абсурдно усложнены, не стабильны и постоянно плюются эксепшен

Вы их готовить не умеете. Стабильности XMLDoc на мобильной платформе можно только позавидовать, т.к. там используется OmniXML. А на Win - парсер Microsoft, который используется чуть меньше, чем везде на Windows.

И - да, я знаю что говорю. В боевом проекте на мобильной платформе стандартный XMLDocument использую (емнип) с 2016 года, начиная с XE7 и по 10.2 включительно. Ни разу не было проблем, связанных с ним.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

парсинг JSON в моей программе: 

uses XSuperObject;

...

myObj:=FromJson<TMyObjectClass>(JSONString);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Использую XML Data Binding  - из Delphi 7, очень плохо что нет такого в XE, приходится держать 2 среды на компе.

Работает быстро и стабильно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 часов назад, valdemar сказал:

плохо что нет такого в XE,

image.png.267c81e5d40bacccb6fabf079a15a6c5.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну, откройте же хоть какой-то проект, а потом посмотрите сюда же. пункт XML появится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От x11
      Подскажите кросс-платформенные компоненты/библиотеки для Delphi Berlin+.
      Кроме OXML, она встроена в Delphi, но справки нет.
    • От Rusland
      Пытаюсь скачать XML с курсами валют с cbr.ru. Получаю ошибку Project raised exception class EEncodingError with message 'No mapping for the Unicode character exists in the target multi-byte code page'. Как исправить?
      //aUrl = http://www.cbr.ru/scripts/XML_daily.asp function GetXML(aURL: string): String; var Http: THTTPClient; Ss: TStringStream; begin Result:=''; Http:=THTTPClient.Create; try Ss:=TStringStream.Create('', TEncoding.UTF8); Http.Get(aURL,ss); Result:=Ss.DataString; // тут ошибка except end; Http.Free; end;
    • От Brovin Yaroslav
      OXML - это новая библиотека по работе с XML для Delphi и Lazarus, разработанная в конце 2013 года.
      Целью OXML является быть универсальной и быстрейшей XML библиотекой для языка Паскаль.
      Основные особенности OXML являются:
      Парсер SAX Реализация DOM  Прямое чтение /запись XML файлов  Полная совместимость при работе с TXMLDocument (XmlIntf.TXMLDocument)  
      Автор: Software Solution Ondřej Pokorný
      Тип лицензии: Open Source
      Ссылка: http://www.kluug.net/oxml.php
      Скачать: SourceForge
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу