Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Yapısı bilinmeyen xml parse etme
#1
Ben epeyi uzun zaman ugrastım yapısı ve içindeki elemanları ve hatta tipi bilinmeyen ( item veya attribute data veya karısık ) bir xml nasıl parse edilir diye?
mükemmel değil hızlı da calısmıyor ama benim işimi gördü ve calısıyor Ben cok ugrastım ve bazı arkadasların ornek Kodlarını da aldım ve hepsini harmanlayıp bunu yaptım eger daha iyi hale getirip gelistiren olursa simdiden ellerine sağlık ben de kullanırım ama bu ne yahu diyen olursa da lütfen hatalı yerlerini söylerse ben de düzeltirim (Delphinin azizligi yuzunden iki ayrı componenti tek bir yapıda kullanmak zorunda kaldım inceleyen zaten anlayacktır birinin yaptıgını diğerine yaptıramayınca ikisini de kullandım içiçe) iyi calısmalar dilerim.
procedure XML_Parse( strXMLText: String; var XMetiket, XMozellik, XMozdeger, XMtxAdi, XMtxBilgi : Tdizi);

procedure ChildNodeIslem( Node : IXMLDOMNode; var XMetiket, XMozellik, XMozdeger : Tdizi );
var
   I ,x  : integer;
   z ,k, q  : integer;
   cNode : IXMLDOMNode;
   yNode : IXMLDOMNode;
   aNode : IXMLDOMNode;
   kNode : IXMLDOMNode;
   qNode : IXMLDOMNode;
begin

 if Node = nil then Exit;
    if Node.HasChildNodes then begin
      for I := 0 to Node.attributes.length-1 do begin
         setlength(XMetiket,length(XMetiket)+1);
         XMetiket[high(XMetiket)]:=trim(node.nodeName);
         setlength(XMozellik,length(XMozellik)+1);
         XMozellik[high(XMozellik)]:=trim(Node.attributes.item[I].nodeName);
         setlength(XMozdeger,length(XMozdeger)+1);
         XMozdeger[high(XMozdeger)]:=trim(VarToStr(Node.attributes.item[I].nodeValue));
      end;

      for k := 0 to node.childNodes.length-1 do begin
        knode:= node.childNodes[k];
        for I := 0 to kNode.attributes.length-1 do begin
         setlength(XMetiket,length(XMetiket)+1);
         XMetiket[high(XMetiket)]:=trim(knode.nodeName);
         setlength(XMozellik,length(XMozellik)+1);
         XMozellik[high(XMozellik)]:=trim(kNode.attributes.item[I].nodeName);
         setlength(XMozdeger,length(XMozdeger)+1);
         XMozdeger[high(XMozdeger)]:=trim(VarToStr(kNode.attributes.item[I].nodeValue));
        end;

        if knode.HasChildNodes then begin
          for x := 0 to knode.childNodes.length-1 do begin
            anode:= knode.childNodes[x];
            for I := 0 to aNode.attributes.length-1 do   begin
             setlength(XMetiket,length(XMetiket)+1);
             XMetiket[high(XMetiket)]:=trim(anode.nodeName);
             setlength(XMozellik,length(XMozellik)+1);
             XMozellik[high(XMozellik)]:=trim(aNode.attributes.item[I].nodeName);
             setlength(XMozdeger,length(XMozdeger)+1);
             XMozdeger[high(XMozdeger)]:=trim(VarToStr(aNode.attributes.item[I].nodeValue));
            end;

            if anode.HasChildNodes then begin
              for z := 0 to anode.childNodes.length-1 do begin
                ynode:= anode.childNodes[z];
                 for I := 0 to yNode.attributes.length-1 do begin
                     setlength(XMetiket,length(XMetiket)+1);
                     XMetiket[high(XMetiket)]:=trim(ynode.nodeName);
                     setlength(XMozellik,length(XMozellik)+1);
                     XMozellik[high(XMozellik)]:=trim(yNode.attributes.item[I].nodeName);
                     setlength(XMozdeger,length(XMozdeger)+1);
                     XMozdeger[high(XMozdeger)]:=trim(VarToStr(yNode.attributes.item[I].nodeValue));
                 end;
                 qnode:= ynode.childNodes[0];

                if ynode.HasChildNodes then begin
                 for q := 0 to ynode.childNodes.length-1 do begin
                  qnode:= ynode.childNodes[q];
                  if containstext(qNode.NodeName,'#') then exit;
                    //showmessage(' iç qnode name   '+ qNode.NodeName);
                    for I := 0 to qNode.attributes.length-1 do begin
                       //showmessage(' iç qnode deger   '+ vartostr(qNode.attributes.item[I].nodeValue));
                       setlength(XMetiket,length(XMetiket)+1);
                       XMetiket[high(XMetiket)]:=trim(qnode.nodeName);
                       setlength(XMozellik,length(XMozellik)+1);
                       XMozellik[high(XMozellik)]:=trim(qNode.attributes.item[I].nodeName);
                       setlength(XMozdeger,length(XMozdeger)+1);
                       XMozdeger[high(XMozdeger)]:=trim(VarToStr(qNode.attributes.item[I].nodeValue));
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end
    else exit;
   while cNode <> nil do
   begin
     ChildNodeIslem(cNode, XMetiket, XMozellik, XMozdeger );
     cNode := cNode.NextSibling;
   end;
end;

 procedure ChildNodeIslem2( Node : IXMLNode; var XMtxAdi,XMtxBilgi: Tdizi  );
 var
   cNode : IXMLNode;
 begin
   if Node = nil then Exit;
     if Node.IsTextElement then
      begin
       if vartostr(node.NodeValue)<> '' then  begin
        setlength(XMtxAdi,length(XMtxAdi)+1);
        XMtxAdi[high(XMtxAdi)]:=trim(node.nodeName);
        setlength(XMtxBilgi,length(XMtxBilgi)+1);
        XMtxBilgi[high(XMtxBilgi)]:=vartostr(trim(node.NodeValue));

       end;
      end;

   cNode := Node.ChildNodes.first;
   while cNode <> nil do
   begin
      ChildNodeIslem2(cNode, XMtxAdi, XMtxBilgi);
       cNode := cNode.NextSibling;
   end;
 end;


var
  Xmldoc: IXMLDOMDocument;
  iNode: IXMLDOMNode;
  Xmldoc1: IXMLDocument;
  iNode1: IXMLNode;
begin
  //attribute okuma
  XMLDoc   := CoDOMDocument.Create();
  XMLDoc.LoadXml(strXMLText);
  iNode := XMLDoc.DocumentElement;
  while iNode <> nil do
  begin
     ChildNodeIslem(iNode, XMetiket, XMozellik, XMozdeger );
     iNode := iNode.NextSibling;
  end;
  //text okuma
  XMLDoc1:= TXMLDocument.Create( nil );
  XMLDoc1.LoadFromXML(strXMLText);
  XMLDoc1.Active   := True;
  iNode1 := XMLDoc1.DocumentElement;
  while iNode1 <> nil do
  begin
     ChildNodeIslem2(iNode1 , XMtxAdi, XMtxBilgi );
     iNode1 := iNode1.NextSibling;
  end;
  XMLDoc1.Active   := False;
end;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Parametre bulunan Query yapısı… kanjey 2 147 13-05-2021, Saat: 09:43
Son Yorum: kanjey
  Faklı bilgisayardaki programa müdahale etme Altıner 2 482 19-02-2021, Saat: 08:50
Son Yorum: bydelphi
  SOAP işlemlerinde TMom yapısı hakkında adelphiforumz 13 2.116 29-01-2021, Saat: 11:50
Son Yorum: glagher
  json parse PİRSUS23 16 6.840 08-01-2021, Saat: 12:03
Son Yorum: tmrksmt
  Delphi ile Json Parse İşlemi yhackup 18 13.260 24-12-2020, Saat: 04:23
Son Yorum: nerondes



Konuyu Okuyanlar: 1 Ziyaretçi