Разбор неизвестного XML прочитанного из стороннего веб-сервиса - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь проанализировать значения XML, подобного этому (полученного от стороннего веб-сервиса), вставляя значения в tStringlist, чтобы проверить их позже

<?xml version="1.0" encoding="utf-8"?>
<libretti pagina="1" n_pagine="1" n_libretti="2">
    <libretto cod_catasto="202000000011" 
              cod_chiave="5e9f2bf12" completo="si" 
              data="2020-04-21" resp_cognome="Colombo" 
              resp_nome="Gianluca" ub_comune="VILLAFRANCA DI VERONA" 
              ub_provincia="VR" ub_indirizzo="Via dei pini" 
              ub_civico="1" ub_palazzo="" ub_scala="" ub_interno=""/>
    <libretto cod_catasto="202000000012" 
              cod_chiave="5e9f2bfsw" completo="si" 
              data="2020-04-22" resp_cognome="Palumso" 
              resp_nome="Federico" ub_comune="VILLAFRANCA DI VERONA" 
              ub_provincia="VR" ub_indirizzo="Via Prosetta" 
              ub_civico="2" ub_palazzo="" ub_scala="" ub_interno=""/>
</libretti>

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

Например:

libretto:
cod_catasto="202000000011"
cod_chiave="5e9f2bf12"
ompleto="si"
data="2020-04-21"
resp_cognome="Colombo"
resp_nome="Gianluca" 
ub_comune="VILLAFRANCA DI VERONA" 
ub_provincia="VR" 
ub_indirizzo="Via dei pini" 
ub_civico="1" 
ub_palazzo="" 
ub_scala="" 
ub_interno=""

и так далее ...

Я застрял с кодом ниже, который не перечисляет все значения, но останавливается на первом, показывая только значение "libretto ="

procedure TForm5.ParseCercaXMLToMemo(TestXML:String);
var
  Doc: IXMLDocument;
  i: Integer;
  LDocument: IXMLDocument;
  LNodeElement, LNode: IXMLNode;
  LAttrValue: string;

begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromXML(TestXML); 

  { Find a specific node. }
  LNodeElement := LDocument.ChildNodes.FindNode('libretti');

  if (LNodeElement <> nil) then
  begin
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      LNode := LNodeElement.ChildNodes.Get(I);
      memo1.lines.add(LNode.NodeName + '=' + LNode.Text);
    end;
  end;

end;

1 Ответ

1 голос
/ 25 апреля 2020

По предложению @Oliver я попробовал этот код, который наконец-то работает, как и ожидалось.

procedure TForm5.ParseCercaXMLToMemo(TestXML:String);
var
  Doc: IXMLDocument;
  i,y: Integer;
  LDocument: IXMLDocument;
  LNodeElement, LNode: IXMLNode;
  LAttrValue: string;

begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromXML(TestXML); { File should exist. }

  { Find a specific node. }
  LNodeElement := LDocument.ChildNodes.FindNode('libretti');
  if (LNodeElement <> nil) then
  begin
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      for y := 0 to LNodeElement.ChildNodes[i].AttributeNodes.count-1 do
        begin
          memo1.lines.add(LNodeElement.ChildNodes[i].AttributeNodes[y].LocalName+' = '+LNodeElement.ChildNodes[i].AttributeNodes[y].Text);
        end;
    end;
  end;

end;
...