-
Andrey Pl (16.08.17 14:05) [0]Как распарсить такую вот 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>
Так что можно или заменить парсер, или перед передачей строки заменять всякие ">" на что-то иное. -
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)
то не надо юзать тлб, будет позднее связывание