dim Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 подскажите чем можно парсить xml? пробовал XMLDocument XMLDocument1.LoadFromXML(strXml); XMLDocument1.Active := True; но он при загрузке файла выдает ошибку "Ошибка в элементе верхнего уровня документа Line:1" этот файл мне приходит от поставщика и при открытии другими программами не ругается на структуру Цитата
0 ENERGY Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Ну так быстрее будет проверять и удалять эту ошибочную строку через StringList, чем искать что-то другое. Цитата
0 dim Опубликовано 29 марта, 2018 Автор Опубликовано 29 марта, 2018 а как определить в чем ошибка, внешне вроде все нормально <?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 #WAMACO Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Проверь через валидатор XML https://www.xmlvalidation.com Цитата
0 #WAMACO Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 20 минут назад, dim сказал: No errors were found Ну тогда все хорошо! Ищите ошибку в загрузчике! Цитата
0 dim Опубликовано 29 марта, 2018 Автор Опубликовано 29 марта, 2018 пользуюсь стандартным компонентом XMLDocument и стразу при загрузке ошибка Цитата
0 POV Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Ошибка у тебя. Пошагово пройдись по своему коду, погляди на какой именно строчке у тебя что. Цитата
0 Akad Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Стандартные парсеры что xml, что json от эмбы абсурдно усложнены, не стабильны и постоянно плюются эксепшенами. Лучше использовать что-то стороннее, нормальное. На гитхабе полно реализаций. Цитата
0 POV Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Что-то такое попробуй. У тебя ошибка с самого начала, где-то что-то не так написал. А еще вероятно буковки русские не прокатывают 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 mazayhin Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 Да и посмотрите на непечатоемые символы в том же n++ Ну или файл поставщика скиньте, в том виде, что приходит, без копирования-вставки Цитата
0 Администраторы Brovin Yaroslav Опубликовано 29 марта, 2018 Администраторы Опубликовано 29 марта, 2018 2 часа назад, dim сказал: пользуюсь стандартным компонентом XMLDocument и стразу при загрузке ошибка Скорее всего ошибка в кодировке. Посмотрите, в компоненте нужно четко указывать кодировку поставляемого документа. И будет вам счастье. Цитата
0 dim Опубликовано 29 марта, 2018 Автор Опубликовано 29 марта, 2018 XMLDocument1.LoadFromXML(strXml); XMLDocument1.Active := True;<== Вот тут и ошибка я пробовал и создавать новый файл (скопировав с оригинала) и символы смотрел уже все нормально но так как файл приходит автоматом и загрузка должна быть без участия пользователя хотелось бы что бы нормально грузило (php ее грузит) Цитата
0 Администраторы Brovin Yaroslav Опубликовано 29 марта, 2018 Администраторы Опубликовано 29 марта, 2018 В дебаге вы не увидите разницы между Ansi кодировкой и UTF-8. Вам нужно убедиться, что в StrXML скорее всего юникод, а в XMLDocument1 скорее всего анси. Цитата
0 dim Опубликовано 29 марта, 2018 Автор Опубликовано 29 марта, 2018 сделал через ls:=TStringList.Create; ls.LoadFromFile(strXml); XMLDocument1.XML:=ls; все заработало Цитата
0 krapotkin Опубликовано 29 марта, 2018 Опубликовано 29 марта, 2018 если ls.loadFromFile то StrXML это имя файла а не XML где-то обман Цитата
0 dim Опубликовано 29 марта, 2018 Автор Опубликовано 29 марта, 2018 в смысле обман? я гружу файл в StringList, а потом его помещаю в XML Цитата
0 krapotkin Опубликовано 30 марта, 2018 Опубликовано 30 марта, 2018 еще раз. вы показали код ls.LoadFromFile(strXML); но в этом случае strXML - это ИМЯ xml-файла а в первом посте XMLDocument1.LoadFromXML(strXml); тут предполагается что strXML - это СОДЕРЖИМОЕ XML-файла так что же там в strXML ??? Цитата
0 Edward Tarasov Опубликовано 30 марта, 2018 Опубликовано 30 марта, 2018 Сам долго парился с этой проблемой в итоге - перевел в 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 kami Опубликовано 31 марта, 2018 Опубликовано 31 марта, 2018 В 29.03.2018 в 17:24, Akad сказал: Стандартные парсеры что xml, что json от эмбы абсурдно усложнены, не стабильны и постоянно плюются эксепшен Вы их готовить не умеете. Стабильности XMLDoc на мобильной платформе можно только позавидовать, т.к. там используется OmniXML. А на Win - парсер Microsoft, который используется чуть меньше, чем везде на Windows. И - да, я знаю что говорю. В боевом проекте на мобильной платформе стандартный XMLDocument использую (емнип) с 2016 года, начиная с XE7 и по 10.2 включительно. Ни разу не было проблем, связанных с ним. Maximus 1 Цитата
0 krapotkin Опубликовано 31 марта, 2018 Опубликовано 31 марта, 2018 парсинг JSON в моей программе: uses XSuperObject; ... myObj:=FromJson<TMyObjectClass>(JSONString); Цитата
0 valdemar Опубликовано 1 апреля, 2018 Опубликовано 1 апреля, 2018 Использую XML Data Binding - из Delphi 7, очень плохо что нет такого в XE, приходится держать 2 среды на компе. Работает быстро и стабильно. Цитата
0 krapotkin Опубликовано 1 апреля, 2018 Опубликовано 1 апреля, 2018 8 часов назад, valdemar сказал: плохо что нет такого в XE, Цитата
0 krapotkin Опубликовано 2 апреля, 2018 Опубликовано 2 апреля, 2018 ну, откройте же хоть какой-то проект, а потом посмотрите сюда же. пункт XML появится... Rusland 1 Цитата
Вопрос
dim
подскажите чем можно парсить xml?
пробовал XMLDocument
XMLDocument1.LoadFromXML(strXml);
XMLDocument1.Active := True;
но он при загрузке файла выдает ошибку
"Ошибка в элементе верхнего уровня документа
Line:1"
этот файл мне приходит от поставщика и при открытии другими программами не ругается на структуру
29 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.