Delphi Can

Orjinalini görmek için tıklayınız: XML Parser
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhabalar ; 

Örnek XML Dosya

DECLARE @sSQL NVARCHAR(MAX)
DECLARE @Parametre NVARCHAR(500)
DECLARE @xml XML
SET @Parametre = N'@XML_OUT XML OUTPUT'
SET @sSQL = N'SELECT @XML_OUT = BulkColumn FROM OPENROWSET(BULK ' + quotename(@xmldosyaadi, '''') + ', SINGLE_BLOB) ROW_SET';
EXEC sp_executesql @sSQL , @Parametre, @XML_OUT = @xml OUTPUT;

Declare @hDoc AS INT
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

INSERT INTO YS_tmp_customer (Id, MessageId, RestaurantName, RestaurantCatalog, RestaurantCategory, CustomerName, CustomerId, CustomerType, PaymentNote, OrderTotal, CustomerPhone, CustomerPhone2, PromoCode, City, Region, Organization, Adress, AddressDescription, AddressId, PaymentMethodId, DeliveryTime, ChangeInTotal, Currency, OrderNote )
SELECT * FROM OPENXML(@hDoc, 'order')
WITH 
(
 Id bigint  '@Id',
 MessageId bigint '@MessageId ',
 RestaurantName varchar(100) '@RestaurantName',
 RestaurantCatalog varchar(30) '@RestaurantCatalog',
 RestaurantCategory varchar(50) '@RestaurantCategory',
 CustomerName varchar(100) '@CustomerName' ,
 CustomerId int '@CustomerId',
 CustomerType smallint '@CustomerType',
 PaymentNote nvarchar(100) '@PaymentNote',
 OrderTotal float '@OrderTotal',
 CustomerPhone nvarchar(30) '@CustomerPhone',
 CustomerPhone2 nvarchar(30) '@CustomerPhone2',
 PromoCode nvarchar(50) '@PromoCode',
 City nvarchar(30) '@City',
 Region nvarchar(30) '@Region',
 Organization nvarchar(50) '@Organization',
 Adress nvarchar(150) '@Address',
 AddressDescription nvarchar(50) '@AddressDescription',
 AddressId nvarchar(50) '@AddressId',
 PaymentMethodId smallint '@PaymentMethodId',
 DeliveryTime datetime '@DeliveryTime',
 ChangeInTotal float '@ChangeInTotal',
 Currency nvarchar(6) '@Currency',
 OrderNote  nvarchar(200) '@OrderNote'
 )

SQL içinden dosyayı okuduğumda sorun yaşamadan dosyayı okuyabiliyorum. Fakat delphi içinden bir türlü pars edemedim. 
Sitede Standart XML dosyaları ile ilgili örnekler var fakat XMl dosyam çok standartlara uymadığından
bir türlü beceremedim. Bu konuda yardımlarınızı rica ediyorum. 

Herkese sağlıklı ve mutlu günler diliyorum.
Merhaba.

* XML'yi inceledim. 

* TEXT olarak eklenen (order) ve içeriğindeki ürünler (product) tablosunu yeni bir XMLDocument olarak ele alırsanız sonuç alabilirsiniz.  Idea

Örneğin :
 aXMLDocument := TXMLDocument.Create(nil);
 aXMLDocument.ParseOptions := aXMLDocument.ParseOptions+[poPreserveWhiteSpace];
 try
   aXMLDocument.XML.Clear;
   aXMLDocument.LoadFromXML( xXML  );

   if aXMLDocument.ChildNodes.Count > 0 then
   begin
     aProject  := aXMLDocument.ChildNodes.First;  // 01  // <?xml version="1.0" encoding="utf-8"?>
     aProject  := aProject.NextSibling;           // 02  // <soap:Envelope
     aProject  := aProject.ChildNodes.First;             // <soap:Body>
     aProject  := aProject.ChildNodes.First;             // <GetMessageResponse
     aProject  := aProject.ChildNodes.First;             // <GetMessageResult>

     aNode     := aProject.ChildNodes.First;             // !! <Order XML> !!
     if ( aNode <> nil ) and (aNode.NodeType = ntText) then
     begin // Product Pane
       aOrderXML := TXMLDocument.Create(nil);
         aOrderXML.ParseOptions := aOrderXML.ParseOptions+[poPreserveWhiteSpace];
         aOrderXML.LoadFromXML( aNode.Text );

       aOrder := aOrderXML.ChildNodes.First;  // Order

       // Order
...
...
...
...

İlgi ve alakanız için çok teşekkür ederim ,
Çok sağolıun.

Örnek projeyi veya kodu kasıtlı olarak mı paylaşmadınız.
Merhaba.

- Kod paylaşımı konusundaki sorunuz için yazıyorum : Cevabım "evet" çala-kalem hazırlanmış, başka bir projeme monte edilmiş bir kod olduğundan terbiyesi için zaman ayırmam gerekliydi. Buna şu an zaman ayırmak istemedim.

- Kurduğunuz yapı size özel bir yapı olduğundan başlığı inceleyen başkalarının aynı yapıyı kullanmayacağını değerlendirerek, kişiye özel bir kod olarak değerlendirdim. Yanılmıyorum değil mi ?

- Ek olarak zaten bu işlemi yaptığınızı, sadece bu konuda takıldığınızı belirmişsiniz, dolayısıyla ben de takıldığınız yere odaklandım.

- Bu verdiğim kod bloğu zaten kodun temeli. Yani gerisi FindNode('Id') vb ile bulup değeri okumak. Zaten bu aşamaya kadar gelmişsiniz. Kodun tamamı sizi hazırcılığa teşvik demektir.

- Şimdi bu aşamada çalışın, eğer hala sonuç alamazsanız bildirin kodu düzenleyip paylaşacağım söz.  Wink
Teşekkür ederim yine de zaman ayırıp cevap yazmışsınız.  Sorun olmayacaksa var kısmındaki tanım ve tipleri paylaşır mısınız  ?
Merhaba.

Kodun Tamamı (şimdi bitirdim) Terbiyesi tamam   Tongue



Uses   Xml.XMLIntf,  Xml.XMLDoc;

function OrderList( xXML : String ): boolean;
Type
  tOrder = Record
  Id, MessageId, RestaurantName, RestaurantCatalog, RestaurantCategory, CustomerName, CustomerId, CustomerType, PaymentNote, OrderTotal, CustomerPhone, CustomerPhone2, PromoCode, City, Region, Organization, Address, AddressDescription, AddressId, PaymentMethodId, DeliveryTime, ChangeInTotal, Currency, OrderNote : String;
end;

Type
  tProduct = record
  id, Name, Price, ListPrice, Quantity, Options, OptionIds, OrderIndex, ParentIndex, PromoParentIndex, ProductOptionId : String;
end;
var
  aXMLDocument,
  aOrderXML   : IXMLDocument;
  aProject,
  aNode,
  aOrder,
  aProduct    : IXMLNode;
  xOrder      : tOrder;
  xProduct    : TProduct;
begin
  Result := False;

  aXMLDocument := TXMLDocument.Create(nil);
  aXMLDocument.ParseOptions := aXMLDocument.ParseOptions+[poPreserveWhiteSpace];
  try
    aXMLDocument.XML.Clear;
    aXMLDocument.LoadFromXML( xXML  );

    if aXMLDocument.ChildNodes.Count > 0 then
    begin
      aProject  := aXMLDocument.ChildNodes.First;  // 01  // <?xml version="1.0" encoding="utf-8"?>
      aProject  := aProject.NextSibling;           // 02  // <soap:Envelope
      aProject  := aProject.ChildNodes.First;             // <soap:Body>
      aProject  := aProject.ChildNodes.First;             // <GetMessageResponse
      aProject  := aProject.ChildNodes.First;             // <GetMessageResult>

      aNode     := aProject.ChildNodes.First;             // !! <Order XML> !!
      if ( aNode <> nil ) and (aNode.NodeType = ntText) then
      begin // Product Pane
        aOrderXML := TXMLDocument.Create(nil);
          aOrderXML.ParseOptions := aOrderXML.ParseOptions+[poPreserveWhiteSpace];
          aOrderXML.LoadFromXML( aNode.Text );

        aOrder := aOrderXML.ChildNodes.First;  // Order

        // Order
          xOrder := Default(tOrder); // Empty Record
            xOrder.Id                   := aOrder.AttributeNodes.FindNode('Id').Text;
            xOrder.MessageId            := aOrder.AttributeNodes.FindNode('MessageId').Text;
            xOrder.RestaurantName       := aOrder.AttributeNodes.FindNode('RestaurantName').Text;
            xOrder.RestaurantCatalog    := aOrder.AttributeNodes.FindNode('RestaurantCatalog').Text;
            xOrder.RestaurantCategory   := aOrder.AttributeNodes.FindNode('RestaurantCategory').Text;
            xOrder.CustomerName         := aOrder.AttributeNodes.FindNode('CustomerName').Text;
            xOrder.CustomerId           := aOrder.AttributeNodes.FindNode('CustomerId').Text;
            xOrder.CustomerType         := aOrder.AttributeNodes.FindNode('CustomerType').Text;
            xOrder.PaymentNote          := aOrder.AttributeNodes.FindNode('PaymentNote').Text;
            xOrder.OrderTotal           := aOrder.AttributeNodes.FindNode('OrderTotal').Text;
            xOrder.CustomerPhone        := aOrder.AttributeNodes.FindNode('CustomerPhone').Text;
            xOrder.CustomerPhone2       := aOrder.AttributeNodes.FindNode('CustomerPhone2').Text;
            xOrder.PromoCode            := aOrder.AttributeNodes.FindNode('PromoCode').Text;
            xOrder.City                 := aOrder.AttributeNodes.FindNode('City').Text;
            xOrder.Region               := aOrder.AttributeNodes.FindNode('Region').Text;
            xOrder.Organization         := aOrder.AttributeNodes.FindNode('Organization').Text;
            xOrder.Address              := aOrder.AttributeNodes.FindNode('Address').Text;
            xOrder.AddressDescription   := aOrder.AttributeNodes.FindNode('AddressDescription').Text;
            xOrder.AddressId            := aOrder.AttributeNodes.FindNode('AddressId').Text;
            xOrder.PaymentMethodId      := aOrder.AttributeNodes.FindNode('PaymentMethodId').Text;
            xOrder.DeliveryTime         := aOrder.AttributeNodes.FindNode('DeliveryTime').Text;
            xOrder.ChangeInTotal        := aOrder.AttributeNodes.FindNode('ChangeInTotal').Text;
            xOrder.Currency             := aOrder.AttributeNodes.FindNode('Currency').Text;
            xOrder.OrderNote            := aOrder.AttributeNodes.FindNode('OrderNote').Text;
            //...
            //...

              Showmessage( 'Restaurant Name : ' + UTF8ToWideString( RawByteString( xOrder.RestaurantName ) ) );

            //...
            //...

        // Ordered Products
        aProduct := aOrder.ChildNodes.First;
        while aProduct <> nil do begin
          xProduct := Default(tProduct); // Empty Record
            xProduct.id                := aProduct.AttributeNodes.FindNode('id').Text;
            xProduct.Name              := aProduct.AttributeNodes.FindNode('Name').Text;
            xProduct.Price             := aProduct.AttributeNodes.FindNode('Price').Text;
            xProduct.ListPrice         := aProduct.AttributeNodes.FindNode('ListPrice').Text;
            xProduct.Quantity          := aProduct.AttributeNodes.FindNode('Quantity').Text;
            xProduct.Options           := aProduct.AttributeNodes.FindNode('Options').Text;
            xProduct.OptionIds         := aProduct.AttributeNodes.FindNode('OptionIds').Text;
            xProduct.OrderIndex        := aProduct.AttributeNodes.FindNode('OrderIndex').Text;
            xProduct.ParentIndex       := aProduct.AttributeNodes.FindNode('ParentIndex').Text;
            xProduct.PromoParentIndex  := aProduct.AttributeNodes.FindNode('PromoParentIndex').Text;
            xProduct.ProductOptionId   := aProduct.AttributeNodes.FindNode('ProductOptionId').Text;
            //...
            //...

              Showmessage( 'Product Name and Price : ' + UTF8ToWideString( RawByteString( xProduct.Name + ' ' + xProduct.Price ) ) );

            //...
            //...
          aProduct := aProduct.NextSibling;
        end;
      end;
      Result := True;
    end else begin
      Showmessage( 'There is no child node exists... ');
    end;
  except
    on E: Exception do
      WriteLn(E.ClassName + ':' + E.Message)
  end;
end;



Temsili Kullanımı 

procedure TForm1.Button1Click(Sender: TObject);
begin
  With TStringList.Create do try
    LoadFromFile( ExtractfilePath(ParamStr(0)) + 'siparis.xml' );
    if OrderList( Text )
      then Showmessage( '*** Operation Success' )
      else Showmessage( '*** Operation FAILED !!!' );
  finally
    Free;
  end;
end;




ufday85bmpjtbdpihiuw.gif


XML Kodu içeriği

Kod:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetMessageResponse xmlns="http://tempuri.org/"><GetMessageResult>&lt;order Id="961645620" MessageId="150504963" RestaurantName="(test1)" RestaurantCatalog="test" RestaurantCategory="11111" CustomerName="Murat Pala" CustomerId="16434227" CustomerType="3" PaymentNote="Nakit (Nakit ödeme) - Lütfen fiş getiriniz." OrderTotal="34.00" CustomerPhone="216 000 00 00" CustomerPhone2="" PromoCode="" City="postakip" Region="Ortaköy" Organization="" Address="Ortaköy caddesi no:1" AddressDescription="Akbank üstü" AddressId="23fbc5531ba990e" PaymentMethodId="1" DeliveryTime="2020.11.24 17:45" ChangeInTotal="0.00" Currency="YSM" OrderNote=""&gt;&lt;product id="5196" Name="Kıymalı Pide" Price="34.00" ListPrice="34.00" Quantity="1" Options="" OptionIds="" OrderIndex="1" ParentIndex="0" PromoParentIndex="0" ProductOptionId="" /&gt;&lt;product id="f5a8" Name="Sütlaç" Price="0.00" ListPrice="0.00" Quantity="1" Options="" OptionIds="" OrderIndex="2" ParentIndex="1" PromoParentIndex="0" ProductOptionId="43578" /&gt;&lt;product id="39775" Name="Coca-Cola Light (33 cl.)" Price="0.00" ListPrice="0.00" Quantity="1" Options="" OptionIds="" OrderIndex="3" ParentIndex="1" PromoParentIndex="0" ProductOptionId="21970973399eeb4" /&gt;&lt;/order&gt;</GetMessageResult></GetMessageResponse></soap:Body></soap:Envelope>
Smile  evet terbiyesi tamam olmuş. Uğraşırdım sizi hakkınızı helal edin. Allah gönlünüze göre versin. Herşey gönlünüzce olsun. Sağlıklı sıhhatli bir ömür nasip etsin rabbim size ve hepimize.

Çok teşekkür ediyorum  tekrar.