Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Как распарсить XML с "<" , ">", <, > [D7]


Andrey Pl   (16.08.17 14:05

Как распарсить такую вот XML и вообще корректна ли она?
проблема в том что ноды заключённые в  <, > не определяются как ноды.

<ERRORSCODE>
<ERRORS><CORRIDENTIFYCODE>90018</CORRIDENTIFYCODE>
<STATEID>90023,90023</STATEID>
<ACCOUNTID>10047</ACCOUNTID>
     </ERRORS>
</ERRORSCODE>


Andrey Pl   (16.08.17 14:07[1]

вот блин  заменило автоматом сущности  &_lt, &_gt; на скобки


Andrey Pl   (16.08.17 14:09[2]

в сущности добавал подчеркивание что не меняло
<ERRORSCODE>
<ERRORS>&_lt;CORRIDENTIFYCODE&_gt;90018&_lt;/CORRIDENTIFYCODE&_gt;
&_lt;STATEID&g_t;90023,90023&_lt;/STATEID&_gt;
&_lt;ACCOUNTID&_gt;10047&_lt;/ACCOUNTID&_gt;
     </ERRORS>
</ERRORSCODE>


rrrrrrr ©   (16.08.17 14:17[3]

исходный xml в вопросе валидный
у рута один чайлд в котором текст.
который и не должен интерпретироваться никак кроме как текст.

итого ровно два узла в документе


Andrey Pl   (16.08.17 14:28[4]

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


rrrrrrr ©   (16.08.17 14:30[5]

копипаст тела из первого поста даст тебе такой xml


Andrey Pl   (16.08.17 14:44[6]

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


rrrrrrr ©   (16.08.17 14:45[7]

ну так он и не врет.
документ-то  валидный


rrrrrrr ©   (16.08.17 14:50[8]

получаешь его.
берешь узел errors
читаешь его содержимое
сзаду и спереду обрамляешь новым рутом
создаешь новый документ и делаешь ему loadXML(<полученный текст>)
в итоге будет рут у которого чайлдами будут как бы узлы из узла errors


Andrey Pl   (16.08.17 15:57[9]

да спасибо так и сделал.


D7   (16.08.17 22:32[10]

> не определяются как ноды.

Ну и кем/чем не определяются-то? Поподробнее чем "определяете" и как именно?

То что вышло в первом посте - валидное и имеет три узла.
То что в третьем сообщении - как бы валидное, но не совсем, спорное: хотя некоторые парсеры и прожёвывают, но многие и ругаются или не понимают. Зависит от того "разворачивают" ли они эти штуки (которые кстати называются не "сущности", а "HTML-code").

А полноценно валидно вот так:
<ERRORSCODE>
<ERRORS><![CDATA[...]]></ERRORS>
</ERRORSCODE>


Так что можно или заменить парсер, или перед передачей строки заменять всякие "&gt;" на что-то иное.


rrrrrrr ©   (17.08.17 08:38[11]

То что в третьем сообщении - как бы валидное, но не совсем, спорное: хотя некоторые парсеры и прожёвывают

в третьем оно точно такое же валидное как и в первом.

не справится с этим только парсер васи пупкина. все остальные справятся


ВладОшин ©   (17.08.17 10:33[12]

примерно так

 MSXML2_TLB, ComObj,

procedure TForm1.btn6Click(Sender: TObject);
var
 Result: IXMLDOMDocument2;
 RootNode: IXMLDOMElement;
 s: string;
 procedure PrintNode(N: IXMLDOMNode; var Tab: string);
 var
   i: Integer;
   s: string;
 begin
   if N = nil then Exit;
   mmo1.Lines.Add(Tab + N.nodeName);
   if N.hasChildNodes then
     for i := 0 to N.childNodes.length -1 do
     begin
       Tab := Tab + '--';
       PrintNode(N.childNodes[i], Tab);
       SetLength(Tab, Length(Tab)-2) ;
     end;

 end;
begin
 Result := CreateComObject(CLASS_DOMDocument) as IXMLDOMDocument2;
 Result.Set_async(false);
 Result.LoadXML(mmo2.Text);
 RootNode := Result.Get_documentElement;
 s := '';
 PrintNode(RootNode, s);

end;


ВладОшин ©   (17.08.17 10:39[13]

Result := CreateComObject(CLASS_DOMDocument) as IXMLDOMDocument2;
 Result.Set_async(false);
 Result.LoadXML(mmo2.Text);
 mmo1.Text :=  Result.xml;


<ERRORSCODE>
<ERRORS><CORRIDENTIFYCODE>90018</CORRIDENTIFYCODE>
 <STATEID>90023,90023</STATEID>
 <ACCOUNTID>10047</ACCOUNTID>
</ERRORS>
</ERRORSCODE>


rrrrrrr ©   (17.08.17 10:51[14]

Если uses  MSXML2_TLB
то тогда уж
Result := CoDomDocument.create()

а если OleVariantVar  := CreateComObject(CLASS_DOMDocument)
то не надо юзать тлб, будет позднее связывание


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо