Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Xml multi node
#1
Arkadaşlar merhaba, Elimde aşağıdaki bir xml dosyası var. Yapmak istediğim herhangi bir node içindeki bir bilgiye ulaşmak. Ancak aşağıdaki kod ile accesviolation hatası alıyorum. Nerede yanlış yapıyor olabilirim.


var
xml:Tstringlist;
sign:string;
Node, AltNode: IXMLNode;
XMLNode: IXMLNode;
begin
xmldoc.Active:=false;
xmldoc.loadfromfile :=dosyayolu;
xmldoc.Active:=true;

Node := xmldoc.DocumentElement;
AltNode := Node.ChildNodes.FindNode('buyerInfo');

       repeat
        showmessage(AltNode.ChildNodes['username'].Text);
        AltNode := AltNode.NextSibling;
       until AltNode = nil;
 end;

xml dosyam


<?xml version="1.0"?>

-<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

<env:Header/>


-<env:Body>


-<sale:getSalesResponse xmlns:sale="http://sale.individual.ws.listingapi.gg.com">


-<return>

<ackCode>success</ackCode>

<responseTime>30/05/2020 23:12:13</responseTime>

<timeElapsed>114 ms</timeElapsed>

<saleCount>1</saleCount>


-<sales>


-<sale>

<saleCode>SC63188551</saleCode>

<status>durum</status>

<statusCode>STATUS_APPROVED</statusCode>

<productId>323683305</productId>

<productTitle>ürün bilgisi</productTitle>

<price>220.0</price>

<cargoPayment>Satıcı Öder</cargoPayment>

<cargoCode>kargokodu</cargoCode>

<amount>1</amount>

<endDate>11/11/2018 15:42:31</endDate>


-<buyerInfo>

<username>*****</username>

<name>******</name>

<surname>*****</surname>

<phone>********</phone>

<mobilePhone>*****</mobilePhone>

<address>******</address>

<district>****</district>

<city>*****</city>


+<neighborhoodType>

<zipCode>*****</zipCode>

</buyerInfo>

<thumbImageLink>******</thumbImageLink>

<lastActionDate>19/11/2018 14:55:20</lastActionDate>

<variantId>0</variantId>

<moneyDate>09/11/2018 21:38:24</moneyDate>


+<shippingInfo>

</sale>

</sales>

<nextPageAvailable>true</nextPageAvailable>

</return>

</sale:getSalesResponse>

</env:Body>

</env:Envelope>
Cevapla
#2
Merhaba,
Tüm node'ları olan bir xml dosyası paylaşabilir misiniz? 
Özel bir bilgi ise, ÖM aracılığı ile de gönderebilirsiniz?
Cevapla
#3
Merhaba.

- Aşağıdaki şekilde bir denemek isteyebilirsiniz.  Idea

uses
  Xml.XMLIntf,  Xml.XMLDoc;

procedure SampleXMLParse( aFileName: String );
var
  xmldoc  : IXMLDocument;
  Node,
  AltNode : IXMLNode;
begin
  xmldoc := TXMLDocument.Create(nil);
  try
    xmldoc.XML.LoadFromFile( aFileName );
    xmldoc.Active := True;

    Node := xmldoc.DocumentElement.ChildNodes.First;
    if Node <> nil then begin
      Node := Node.ChildNodes.FindNode( 'sales' );
      if Node <> nil then begin
        Node := Node.ChildNodes.FindNode( 'sale' );
        if Node <> nil then begin
          Node := Node.ChildNodes.FindNode( 'buyerInfo' );
          if Node <> nil then begin
            AltNode := Node.ChildNodes.FindNode('username');
            while AltNode <> nil do begin
              ShowMessageFmt('%s = %s', [ AltNode.NodeName, AltNode.NodeValue ]);
              AltNode := AltNode.NextSibling;
            end;
          end;
        end;
      end;
    end;
  finally
    xmldoc.Active := false;
    xmldoc := nil;
  end;
end;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
Gönderdiğiniz XML her ne kadar XML'e benzese de, ek SOAP protokollerini içeren Microsoft SOAP konfigürasyon dosyasıdır.
Mantıken WSDL Importer ile bu endpoint'in implement edilmesi daha uygun olacaktır. 
Bu durumda, SOAP servisine bir istekte bulunup, dönen sonucu bu sınıfa gönderdiğinizde, istediğiniz alanlara ulaşabileceksiniz.
Fakat ille de bu XML üzerinden yapılamaz mı derseniz?
O da mümkün.
Öncelikle SOPA XML'ini standart bir XML'e dönüştürmelisiniz. Bunu basitçe StringReplace fonksiyonu ile de yapabilirsiniz. Yada bir defaya mahsus elle düzeltmeniz bile yeterlidir. 
Daha sonra aşağıda anlatacağım yöntemle XML'i bir sınıf kullanarak, tüm alanlarına ulaşabilirsiniz.

Gönderdiğiniz orjinal XML dosyası ile değiştirilmiş XML dosyasının farklarını aşağıdaki resimde gösterilmiştir.
 
   

İki XML'de size gönderiyorum, teyid ve karşılaştırmak amacıyla gözden geçirirsiniz.

Yeni XML ile yola devam ederek bu XML üzerindeki tüm alanları nasıl okuyabileceğinizi anlatayım.
1- Mevcut projeniz açık iken, File > New > Other > Delphi > Web --->XML Data Binding aracını açın ve XML dosyasını seçin. 

   

   

2- Diğer adımları Next butonu ile geçin (dilerseniz; aynı araç üzerinde, oluşan tüm interface ve tipleri değiştirebilirsiniz).
3- XML dosyası ile aynı isimli bir Delphi kaynak kod dosyası (.pas) oluşacaktır. İsterseniz, ismini değiştirerek de kullanabilirsiniz.
4- Son olarak bu Unit'i kullanacağınız yerdeki Implementation bölümünün Uses'ına ekleyerek, aşağıda göstereceğim kodlama tekniği tüm alanlara ulaşabilirsiniz.
implementation

Uses ornekxml;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 procedure SetXMLYaz(const AlanDegeri: String);
 begin
   Memo1.Lines.Add(AlanDegeri);
 end;

var
 xmlOku: IXMLBodyType;

begin
 xmlOku := LoadBody('C:\Users\USR\Desktop\XMLBinding\ornekxml.xml');
 SetXMLYaz('AckCode: ' + xmlOku.Return.AckCode);
 SetXMLYaz('responseTime: ' + xmlOku.Return.responseTime);
 SetXMLYaz('timeElapsed: ' + xmlOku.Return.timeElapsed);
 SetXMLYaz('saleCount: ' + xmlOku.Return.saleCount.ToString);
 SetXMLYaz('status: ' + xmlOku.Return.Sales.Sale.status);
 SetXMLYaz('productTitle: ' + xmlOku.Return.Sales.Sale.productTitle);
 SetXMLYaz('price: ' + xmlOku.Return.Sales.Sale.price);
 SetXMLYaz('BuyerInfo.Phone: ' + xmlOku.Return.Sales.Sale.BuyerInfo.Phone);
 SetXMLYaz('neighborhoodName: ' + xmlOku.Return.Sales.Sale.BuyerInfo.NeighborhoodType.neighborhoodName);
 SetXMLYaz('ShippingExpireDate: ' + xmlOku.Return.Sales.Sale.ShippingInfo.ShippingExpireDate);
end;

   

Not: @hassur bey için özel bir iş olduğundan, XML import sonucu oluşan Unit'i ve XML dosyalarını burada paylaşmadım.
Cevapla
#5
Üstad çok teşekkür ederim.
Cevapla
#6
Merhaba Fesih Bey , çok özür dileyerek bir soru sormak istiyorum.

Gönderdiğiniz XML her ne kadar XML'e benzese de, ek SOAP protokollerini içeren Microsoft SOAP konfigürasyon dosyasıdır.
Mantıken WSDL Importer ile bu endpoint'in implement edilmesi daha uygun olacaktır.
Bu durumda, SOAP servisine bir istekte bulunup, dönen sonucu bu sınıfa gönderdiğinizde, istediğiniz alanlara ulaşabileceksiniz.

Burda SOAP servisine bir istekte bulunduktan sonra dönen sonucu bu sınıfa göndermekten kastınız nedir? Bir sonuç dönüyor doğru ama bu dönen sonuç ilk dönen yani SOAP konfigürasyon dosyası diye tabir ettiğiniz dosya ve bunu anlaşılır XML e nasıl çevireceğiz acaba. ?
Cevapla
#7
(06-08-2020, Saat: 18:44)Bay_Y Adlı Kullanıcıdan Alıntı: Merhaba Fesih Bey , çok özür dileyerek bir soru sormak istiyorum.

Gönderdiğiniz XML her ne kadar XML'e benzese de, ek SOAP protokollerini içeren Microsoft SOAP konfigürasyon dosyasıdır.
Mantıken WSDL Importer ile bu endpoint'in implement edilmesi daha uygun olacaktır.
Bu durumda, SOAP servisine bir istekte bulunup, dönen sonucu bu sınıfa gönderdiğinizde, istediğiniz alanlara ulaşabileceksiniz.

Burda SOAP servisine bir istekte bulunduktan sonra dönen sonucu bu sınıfa göndermekten kastınız nedir? Bir sonuç dönüyor doğru ama bu dönen sonuç ilk dönen yani SOAP konfigürasyon dosyası diye tabir ettiğiniz dosya ve bunu anlaşılır XML e nasıl çevireceğiz acaba. ?

Merhaba,
Demek istediğim,  gelen veriyi alıp, çözümlemek ve farklı bir şablona dönüştürmek.
Sizin gönderdiğiniz XML'den yola çıkarak, bir çözüm üretelim.
Soap servisten gelen XML içerisindeki belli bir bölümü alıp, işlemeniz gerekiyor. 
Bu bölümün Menu tag'ı içindeki elemanlar olduğunu tahmin ediyorum. 

   

Soap XML içindeki Menu tag'ını temel (xml root) alıp, dinamik olarak yeni bir xml yapısı oluşturmak için aşağıdaki adımları takip ettim.
- Öncelikle soap XML'i bir fonksiyona gönderip, istediğim formatta bir XML sonuç dönmesini sağladım. 

function GetIslenebilirXML(const NativeXMLPath: String): IXMLDocument;
const
 Bas = '<Menu';
 Son = '</Menu';
 xmlMeta = '<?xml version="1.0" encoding="utf-8"?>';
var
 tmpXML: String;
 Doc: IXMLDocument;
begin
 Doc := TXMLDocument.Create(nil);
 Doc.LoadFromFile(NativeXMLPath);
 tmpXML := Doc.Xml.Text;
 tmpXML := tmpXML.Remove(0, pos(Bas, tmpXML) - 1);
 tmpXML := tmpXML.Remove(pos(Son, tmpXML) + Son.Length);
 tmpXML := tmpXML.Replace('diffgr:', '').Replace('msdata:', '');
 tmpXML := xmlMeta + sLineBreak + tmpXML;
 Doc.Xml.Text := tmpXML;
 Result := Doc;
end;

Örnek metoda bakarsanız, diffgr ve msdata gibi native tag yapısını bozan meta bilgileri de temizledik. 

Soap XML yapısı:
   

Soap XML'i yukarıdaki fonksiyona gönderdiğinizde aşağıdaki gibi yeni bir XML oluşacaktır.

   

- Sonraki adımda yeni XML'i manuel olarak alıp, bir dosyaya kaydediyoruz. 
- Xml yapısını çözümleyebilmek için XML Data Binding yapısını kullanıyoruz. 
  XML Data Binding, oluşturduğumuz XML yapısına uygun bir interface üretiyor. Oluşan pas dosyasını proje dizinine kaydediyoruz ve projeye ekliyoruz.

Son olarak aşağıda verdiğim kod yapısı ile yeni XML'i istediğiniz gibi kullanabilirsiniz.
var
 xmlOku: IXMLMenuType;
 I: Integer;
begin
 xmlOku := GetMenu(GetIslenebilirXML('C:\Users\USR\Desktop\xmlOku2\xml1Org.xml'));
 Memo1.Lines.Add('Ürün Sayısı: ' + xmlOku.Count.toString);
 Memo1.Lines.Add('-----------------------------------------');
 for I := 0 to xmlOku.Count - 1 do
 begin
   Memo1.Lines.Add(xmlOku.Products[i].Id);
   Memo1.Lines.Add('');
   Memo1.Lines.Add(xmlOku.Products[i].Name);
   Memo1.Lines.Add(xmlOku.Products[i].Title);
   Memo1.Lines.Add(xmlOku.Products[i].Price);
   Memo1.Lines.Add(xmlOku.Products[i].Description);
   Memo1.Lines.Add('-----------------------------------------');
 end;
end;
   

Örnek Uygulama : 
.zip   xmlOkuYaz.zip (Dosya Boyutu: 27,57 KB / İndirme Sayısı: 58)
Cevapla
#8
(07-08-2020, Saat: 17:19)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(06-08-2020, Saat: 18:44)Bay_Y Adlı Kullanıcıdan Alıntı: Merhaba Fesih Bey , çok özür dileyerek bir soru sormak istiyorum.

Gönderdiğiniz XML her ne kadar XML'e benzese de, ek SOAP protokollerini içeren Microsoft SOAP konfigürasyon dosyasıdır.
Mantıken WSDL Importer ile bu endpoint'in implement edilmesi daha uygun olacaktır.
Bu durumda, SOAP servisine bir istekte bulunup, dönen sonucu bu sınıfa gönderdiğinizde, istediğiniz alanlara ulaşabileceksiniz.

Burda SOAP servisine bir istekte bulunduktan sonra dönen sonucu bu sınıfa göndermekten kastınız nedir? Bir sonuç dönüyor doğru ama bu dönen sonuç ilk dönen yani SOAP konfigürasyon dosyası diye tabir ettiğiniz dosya ve bunu anlaşılır XML e nasıl çevireceğiz acaba. ?

Merhaba,
Demek istediğim,  gelen veriyi alıp, çözümlemek ve farklı bir şablona dönüştürmek.
Sizin gönderdiğiniz XML'den yola çıkarak, bir çözüm üretelim.
Soap servisten gelen XML içerisindeki belli bir bölümü alıp, işlemeniz gerekiyor. 
Bu bölümün Menu tag'ı içindeki elemanlar olduğunu tahmin ediyorum. 



Soap XML içindeki Menu tag'ını temel (xml root) alıp, dinamik olarak yeni bir xml yapısı oluşturmak için aşağıdaki adımları takip ettim.
- Öncelikle soap XML'i bir fonksiyona gönderip, istediğim formatta bir XML sonuç dönmesini sağladım. 

function GetIslenebilirXML(const NativeXMLPath: String): IXMLDocument;
const
 Bas = '<Menu';
 Son = '</Menu';
 xmlMeta = '<?xml version="1.0" encoding="utf-8"?>';
var
 tmpXML: String;
 Doc: IXMLDocument;
begin
 Doc := TXMLDocument.Create(nil);
 Doc.LoadFromFile(NativeXMLPath);
 tmpXML := Doc.Xml.Text;
 tmpXML := tmpXML.Remove(0, pos(Bas, tmpXML) - 1);
 tmpXML := tmpXML.Remove(pos(Son, tmpXML) + Son.Length);
 tmpXML := tmpXML.Replace('diffgr:', '').Replace('msdata:', '');
 tmpXML := xmlMeta + sLineBreak + tmpXML;
 Doc.Xml.Text := tmpXML;
 Result := Doc;
end;

Örnek metoda bakarsanız, diffgr ve msdata gibi native tag yapısını bozan meta bilgileri de temizledik. 

Soap XML yapısı:


Soap XML'i yukarıdaki fonksiyona gönderdiğinizde aşağıdaki gibi yeni bir XML oluşacaktır.



- Sonraki adımda yeni XML'i manuel olarak alıp, bir dosyaya kaydediyoruz. 
- Xml yapısını çözümleyebilmek için XML Data Binding yapısını kullanıyoruz. 
  XML Data Binding, oluşturduğumuz XML yapısına uygun bir interface üretiyor. Oluşan pas dosyasını proje dizinine kaydediyoruz ve projeye ekliyoruz.

Son olarak aşağıda verdiğim kod yapısı ile yeni XML'i istediğiniz gibi kullanabilirsiniz.
var
 xmlOku: IXMLMenuType;
 I: Integer;
begin
 xmlOku := GetMenu(GetIslenebilirXML('C:\Users\USR\Desktop\xmlOku2\xml1Org.xml'));
 Memo1.Lines.Add('Ürün Sayısı: ' + xmlOku.Count.toString);
 Memo1.Lines.Add('-----------------------------------------');
 for I := 0 to xmlOku.Count - 1 do
 begin
   Memo1.Lines.Add(xmlOku.Products[i].Id);
   Memo1.Lines.Add('');
   Memo1.Lines.Add(xmlOku.Products[i].Name);
   Memo1.Lines.Add(xmlOku.Products[i].Title);
   Memo1.Lines.Add(xmlOku.Products[i].Price);
   Memo1.Lines.Add(xmlOku.Products[i].Description);
   Memo1.Lines.Add('-----------------------------------------');
 end;
end;


Örnek Uygulama : 

Çok teşekkür ediyorum çok sağolun uğraşırdım sizi kusura bakmayın. Müthiş bir anlatım ve örnekleme olmuş sanırım bir çok kişininde işine yarayacaktır. Ama Benim için müthiş bir kılavuz oldu.
Cevapla
#9
@TescilsizUzman Teşekkür ederim...

xmlOkuYaz uygulamasından ilham alarak E-Fatura içeriğini okuduk..

Küçük bir katkı da bizden olsun Smile

Forma bir Memo, detay için de bir Strring grid koymanız yeterli...
const

  sFile = 'C:\Users\yazilim\Desktop\E092022000000732.xml'; //'C:\Users\idealist\Desktop\_iki_kalem.xml'; //'C:\Users\yazilim\Desktop\E092022000000732.xml'



procedure GetGonderenDetay( ANode : IXMLNode; ATitle : string = '' );
var
 tmpNode : IXMLNode;
 sAttributes,
 sBaslik,
 sDetay  : string;
begin
 Girinti := Girinti + 3;
 tmpNode := ANode.ChildNodes.First;

 repeat
   if Assigned(tmpNode) then
     begin
       if (tmpNode.IsTextElement = true) Then
           Begin
             sAttributes := '';
             if tmpNode.HasAttribute('schemeID') then
                sAttributes := tmpNode.AttributeNodes.FindNode('schemeID').Text;
                //sAttributes := ' ( Att : ' + tmpNode.AttributeNodes.FindNode('schemeID').Text + ' ) ';

                //COUNT ile kontrol etmek için
                //sAttributes := tmpNode.AttributeNodes.Get(0).Text;

             (*
             Form1.Memo1.Lines.Add( BoslukAt(Girinti)+ ' : '+tmpNode.LocalName+ ' -> '+
                 //' nodeName: '+ tmpNode.NodeName +
                 //' nodeValue: '+ tmpNode.NodeValue +
                 //' nodeXML:'+ tmpNode.XML +
                 sAttributes +
                 ' Text: '+ tmpNode.Text);
             *)


             if sAttributes <> '' then
               sBaslik := sAttributes
             else
               sBaslik := tmpNode.LocalName;

             if Pos('cbc:',tmpNode.NodeName) > 0 then
               sBaslik := ATitle + ' - ' + sBaslik;

             sDetay := tmpNode.Text;

             Form1.Memo1.Lines.Add( '   ' + sBaslik + ' : '+ sDetay); //+ '      T: ' + ATitle + '  T2 ' + tmpNode.NodeName+ '  ' );

           End
         Else
           Begin
             //Form1.Memo1.Lines.Add(BoslukAt(Girinti)+'- '+ tmpNode.LocalName);
             GetGonderenDetay(tmpNode, Copy(tmpNode.NodeName, 5, Length(tmpNode.NodeName)) );
           End;

         tmpNode  := tmpNode.NextSibling;//bir sonraki node ye atla...
     end;
 until tmpNode = Nil;
end;

procedure GetAliciDetay( ANode : IXMLNode; ATitle : string = '' );
var
 tmpNode : IXMLNode;
 sAttributes,
 sBaslik,
 sDetay,
 sFaturaNo,
 sVergiNo : string;
begin
 Girinti := Girinti + 3;
 tmpNode := ANode.ChildNodes.First;

 repeat
   if Assigned(tmpNode) then
     begin
       if (tmpNode.IsTextElement = true) Then
           Begin
             sAttributes := '';
             if tmpNode.HasAttribute('schemeID') then
                sAttributes := tmpNode.AttributeNodes.FindNode('schemeID').Text;

             if sAttributes <> '' then
               sBaslik := sAttributes
             else
               sBaslik := tmpNode.LocalName;

             if Pos('cbc:',tmpNode.NodeName) > 0 then
               sBaslik := ATitle + ' - ' + sBaslik;

             sDetay := tmpNode.Text;

             Form1.Memo1.Lines.Add( '   ' + sBaslik + ' : '+ sDetay); //+ '      T: ' + ATitle + '  T2 ' + tmpNode.NodeName+ '  ' );

           End
         Else
           Begin
             GetAliciDetay(tmpNode, Copy(tmpNode.NodeName, 5, Length(tmpNode.NodeName)) );
           End;

         tmpNode  := tmpNode.NextSibling;//bir sonraki node ye atla...
     end;
 until tmpNode = Nil;
end;


const
 colSira       = 1;
 colUrunKod    = 2;
 colBarkod     = 3;
 colUrunAdi    = 4;
 colMiktar     = 5;
 colBirim      = 6;
 colBirimFiyat = 7;
 colDovizTipi  = 8;
 colKdvOran    = 9;
 colTutar      = 10;


procedure TForm1.SetGrid;
begin
 StringGrid1.ColCount := 11;
 StringGrid1.RowCount :=  2;
 StringGrid1.Rows[1].Clear;

 StringGrid1.Cols[colSira].Text        := 'Sıra';
 StringGrid1.Cols[colUrunKod].Text     := 'Stok Kodu';
 StringGrid1.Cols[colBarkod].Text      := 'Barkod';
 StringGrid1.Cols[colUrunAdi].Text     := 'Stok Adı';
 StringGrid1.Cols[colMiktar].Text      := 'Miktar';
 StringGrid1.Cols[colBirim].Text       := 'Birim Kodu';
 StringGrid1.Cols[colBirimFiyat].Text  := 'Fiyat';
 StringGrid1.Cols[colDovizTipi].Text   := 'PB';
 StringGrid1.Cols[colKdvOran].Text     := 'KDV %';
 StringGrid1.Cols[colTutar].Text       := 'Tutar';


 StringGrid1.ColWidths[0]              := 10;
 StringGrid1.ColWidths[colSira]        := 35;
 StringGrid1.ColWidths[colUrunKod]     := 80;
 StringGrid1.ColWidths[colBarkod]      := 80;
 StringGrid1.ColWidths[colUrunAdi]     := 150;
 StringGrid1.ColWidths[colMiktar]      := 50;
 StringGrid1.ColWidths[colBirim]       := 50;
 StringGrid1.ColWidths[colBirimFiyat]  := 70;
 StringGrid1.ColWidths[colDovizTipi]   := 50;
 StringGrid1.ColWidths[colKdvOran]     := 50;
 StringGrid1.ColWidths[colTutar]       := 70;
end;

procedure GetSatir( ANode : IXMLNode; ATitle : string = '' );
var
 tmpNode,
 tmpSubNode,
 tmpSubNode2 : IXMLNode;
 sAttributes,
 sBaslik,
 sDetay,
 sFaturaNo,
 sVergiNo : string;

 iRow      : integer;

 tmpGrd    : TStringGrid;
begin
 tmpNode := ANode.ChildNodes.First;

 tmpGrd  := Form1.StringGrid1;
 iRow    := tmpGrd.RowCount-1;

 //tmpGrd.Cells[ colSira,    iRow ] := tmpNode.ChildNodes.FindNode('cbc:ID').Text;
 //tmpGrd.Cells[ colMiktar,  iRow ] := tmpNode.ChildNodes.FindNode('cbc:InvoicedQuantity').Text;

 //tmpGrd.Cells[ colUrunKod, iRow ] := tmpNode.ChildNodes.FindNode('cac:Item').ChildNodes.FindNode('cbc:Name').Text;
 //tmpGrd.Cells[ colUrunAdi, iRow ] := tmpNode.ChildNodes.FindNode('cac:Item').ChildNodes.FindNode('cac:SellersItemIdentification').ChildNodes.FindNode('cbc:ID').Text;

 repeat
   if Assigned(tmpNode) then
     begin
       //if (tmpNode.IsTextElement = True) Then
           begin
             if ( tmpNode.NodeName = 'cbc:ID' ) and ( tmpNode.ParentNode.NodeName = 'cac:InvoiceLine' ) then //SIRA NO
               begin
                 tmpGrd.Cells[ colSira,    iRow ] := tmpNode.Text;
               end

             else if tmpNode.NodeName = 'cbc:InvoicedQuantity' then
               begin
                 tmpGrd.Cells[ colMiktar,  iRow ] := tmpNode.Text;

                 if tmpNode.HasAttribute('unitCode') then
                   tmpGrd.Cells[ colBirim,   iRow ] := tmpNode.AttributeNodes.FindNode('unitCode').Text;
               end

             (*
                 <cac:InvoiceLine>
                     <cbc:ID>1</cbc:ID>
                     <cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>
                     <cbc:LineExtensionAmount currencyID="TRY">7350.7</cbc:LineExtensionAmount>
                     <cac:TaxTotal>
                         <cbc:TaxAmount currencyID="TRY">588.06</cbc:TaxAmount>
                         <cac:TaxSubtotal>
                             <cbc:TaxableAmount currencyID="TRY">7350.7</cbc:TaxableAmount>
                             <cbc:TaxAmount currencyID="TRY">588.06</cbc:TaxAmount>
                             <cbc:Percent>8</cbc:Percent>
                             <cac:TaxCategory>
                                 <cac:TaxScheme>
                                     <cbc:Name>GERÇEK USULDE KATMA DEĞER VERGİSİ</cbc:Name>
                                     <cbc:TaxTypeCode>0015</cbc:TaxTypeCode>
                                 </cac:TaxScheme>
                             </cac:TaxCategory>
                         </cac:TaxSubtotal>
                     </cac:TaxTotal>
                     <cac:Item>
                         <cbc:Name>EĞİTİM BEDELİ</cbc:Name>
                         <cac:SellersItemIdentification>
                             <cbc:ID>UMSTJ</cbc:ID>
                         </cac:SellersItemIdentification>
                     </cac:Item>
                     <cac:Price>
                         <cbc:PriceAmount currencyID="TRY">7350.7</cbc:PriceAmount>
                     </cac:Price>
                 </cac:InvoiceLine>
             *)

             else if tmpNode.NodeName = 'cac:TaxTotal' then
               begin
                 tmpSubNode := tmpNode.ChildNodes['cac:TaxSubtotal'].ChildNodes.First;

                 repeat
                   if Assigned(tmpSubNode) then
                     begin
                       if tmpSubNode.NodeName = 'cbc:TaxAmount' then
                         begin
                           tmpGrd.Cells[ colBirimFiyat,  iRow ] := tmpSubNode.Text;

                           if tmpSubNode.HasAttribute('currencyID') then
                             tmpGrd.Cells[ colDovizTipi, iRow ] := tmpSubNode.AttributeNodes.FindNode('currencyID').Text;
                         end

                       else if tmpSubNode.NodeName = 'cbc:Percent' then
                         begin
                           tmpGrd.Cells[ colKdvOran,     iRow ] := tmpSubNode.Text;
                         end

                       else if tmpSubNode.NodeName = 'cbc:TaxableAmount' then
                         begin
                           tmpGrd.Cells[ colTutar,       iRow ] := tmpSubNode.Text;
                         end;
                     end;

                     tmpSubNode  := tmpSubNode.NextSibling;//bir sonraki node ye atla...

                 until tmpSubNode = Nil;
               end

             else if tmpNode.NodeName = 'cac:Item' then
               begin
                 tmpSubNode := tmpNode.ChildNodes.First;

                 repeat
                   if Assigned(tmpSubNode) then
                     begin
                       if tmpSubNode.NodeName = 'cac:SellersItemIdentification' then
                         begin
                           tmpSubNode2 := tmpSubNode.ChildNodes.First;
                           tmpGrd.Cells[ colUrunKod,  iRow ] := tmpSubNode2.Text; // tmpSubNode.ChildNodes['cbc:ID'].Text;
                         end

                       else if tmpSubNode.NodeName = 'cac:ManufacturersItemIdentification' then
                         begin
                           tmpSubNode2 := tmpSubNode.ChildNodes.First;
                           tmpGrd.Cells[ colBarkod,  iRow ] := tmpSubNode2.Text; //tmpSubNode.ChildNodes['cbc:ID'].Text;
                         end

                       else if tmpSubNode.NodeName = 'cbc:Name' then
                         begin
                           tmpGrd.Cells[ colUrunAdi,  iRow ] := tmpSubNode.Text;
                         end;
                     end;

                     tmpSubNode  := tmpSubNode.NextSibling;//bir sonraki node ye atla...

                 until tmpSubNode = Nil;
               end;

           end;
         //else
           begin
             //GetSatir(tmpNode );
           end;

         tmpNode  := tmpNode.NextSibling;//bir sonraki node ye atla...
     end;
 until tmpNode = Nil;


end;



procedure TForm1.Button2Click(Sender: TObject);
var
 D : IXMLDocument;
 ANode: IXMLNode;
begin
 SetGrid;

 memo1.Lines.Clear;
 D:= LoadXMLDocument(sFile);
 D.Active := True ;
 ANode:=D.DocumentElement.ChildNodes.First; // ilk node invoice tir
 repeat

   if Assigned(ANode)Then
     begin
         if (ANode.IsTextElement = False) Then
           begin
             if ANode.NodeName = 'cac:AccountingSupplierParty' then
               begin
                 Memo1.Lines.Add( '------------   GÖNDERİCİ BİLGİLERİ   -----------------------');

                   GetGonderenDetay( ANode );

                 Memo1.Lines.Add( '------------------------------------------------------------');
               end;

             if ANode.NodeName = 'cac:AccountingCustomerParty' then
               begin
                 Memo1.Lines.Add( '');
                 Memo1.Lines.Add( '------------   ALICI BİLGİLERİ   -----------------------');

                   GetAliciDetay( ANode );

                 Memo1.Lines.Add( '------------------------------------------------------------');
               end;

             if ANode.NodeName = 'cac:InvoiceLine' then
               begin
                 //Memo1.Lines.Add( '');
                 //Memo1.Lines.Add( '------------   SATIR BİLGİLERİ   -----------------------');

                   GetSatir( ANode );

                   Form1.StringGrid1.RowCount := Form1.StringGrid1.RowCount + 1;

                 //Memo1.Lines.Add( '------------------------------------------------------------');
               end;
           end;



         ANode  := ANode.NextSibling;//bir sonraki node ye atla...
     End;
 until ANode=Nil;


 Form1.StringGrid1.RowCount := Form1.StringGrid1.RowCount - 1;

end;
Girdim İlim Meclisine, 
Eyledim Kıldım Talep, 

Dediler İlim Geride, 
İlla Edep İlla Edep.

Yunus Emre
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  No mapping for the Unicode character exists in the target multi-byte code page powerghost 8 4.415 20-04-2023, Saat: 10:19
Son Yorum: yhackup
  Metin Belgesinden satır satır okuyarak multi task ya da multi thread işlem yapma eroniko 2 1.091 23-07-2021, Saat: 13:14
Son Yorum: eroniko
  Multi Device uygulaması ile WEB SİTE'sinin html içerik bilgisini almak guverdik 0 618 24-04-2021, Saat: 11:59
Son Yorum: guverdik
  Multi-Thread Partial Download yhackup 0 1.753 26-10-2018, Saat: 16:56
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi