Yorumları: 112
Konuları: 27
Kayıt Tarihi: 17-10-2016
Rep Puanı: 414 Acemi
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>
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
Merhaba,
Tüm node'ları olan bir xml dosyası paylaşabilir misiniz?
Özel bir bilgi ise, ÖM aracılığı ile de gönderebilirsiniz?
Yorumları: 1.664
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 19.042 Üstad
Merhaba.
- Aşağıdaki şekilde bir denemek isteyebilirsiniz.
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
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
04-06-2020, Saat: 13:53
(Son Düzenleme: 04-06-2020, Saat: 18:29, Düzenleyen: TescilsizUzman.)
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.
Yorumları: 112
Konuları: 27
Kayıt Tarihi: 17-10-2016
Rep Puanı: 414 Acemi
Üstad çok teşekkür ederim.
Yorumları: 656
Konuları: 69
Kayıt Tarihi: 24-01-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 892 Acemi
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. ?
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
07-08-2020, Saat: 17:19
(Son Düzenleme: 07-08-2020, Saat: 17:29, Düzenleyen: TescilsizUzman.)
(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 :
xmlOkuYaz.zip (Dosya Boyutu: 27,57 KB / İndirme Sayısı: 58)
Yorumları: 656
Konuları: 69
Kayıt Tarihi: 24-01-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 892 Acemi
07-08-2020, Saat: 21:58
(Son Düzenleme: 07-08-2020, Saat: 22:56, Düzenleyen: Bay_Y.)
(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.
Yorumları: 15
Konuları: 0
Kayıt Tarihi: 11-04-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 42 Başlangıç
19-06-2022, Saat: 11:03
(Son Düzenleme: 19-06-2022, Saat: 11:06, Düzenleyen: idealist.)
@ TescilsizUzman Teşekkür ederim...
xmlOkuYaz uygulamasından ilham alarak E-Fatura içeriğini okuduk..
Küçük bir katkı da bizden olsun
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
|