Перейти к содержанию
  • Регистрация
  • 0
dim

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

Вопрос

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

пробовал XMLDocument

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

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

Line:1"

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

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


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

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

  • 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

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

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


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

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


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

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

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

 

 

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


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

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

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


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

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

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

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

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

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

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

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

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


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

    • От 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 пользователей онлайн

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

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