Конференция "Основная" » Как распарсить XML с "<" , ">", <, > [D7]
 
  • 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>



    Так что можно или заменить парсер, или перед передачей строки заменять всякие "&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)
    то не надо юзать тлб, будет позднее связывание
 
Конференция "Основная" » Как распарсить XML с "<" , ">", <, > [D7]
Есть новые Нет новых   [118463   +19][b:0][p:0.001]