Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


dim

Вопрос

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

пробовал XMLDocument

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

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

Line:1"

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 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

Стандартные парсеры что 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
  • Администраторы
2 часа назад, dim сказал:

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

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

 

Ссылка на комментарий
  • 0

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

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

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

Ссылка на комментарий
  • 0
  • Администраторы

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

Ссылка на комментарий
  • 0

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

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

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

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

Ссылка на комментарий
  • 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 включительно. Ни разу не было проблем, связанных с ним.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...