Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Mesaj gönderen aegean »

Merhaba arkadaşlar. Benim yapmaya calıstıgım herkesin burada sundugunun aksine bilinmeyen yapıdaki bir xml dosyasını açıp onun butun node larını okuyup bu node ların içinde var olan items isimleri ve değerlerini okumak ve tabii diğer bir yapıda var olan attribute değerleri içinde bilgi gönderilen dosylardaki attribute isimlerin ve attribute değerlerini de alabilmek idi. Yeni başladıgım xml okuma çalısmalarında hali hazırda 4. kademeye kadar alt node ları okuyup içerisinde bulunan items ve değerlerini ayırabiliyorum(Tabi henüz acemice yazılmıs bir code ile) ama attribute lerin attribute isimlerini bilmeden değerlerini okuma imkani olmadığı gibi attribute isimlerini de nasıl alabileceğim konusunda bir çıkış bulamadım. TXMLdocument bileşeni ile bunu yapmak mümkünmü? ve yapısı bilinmeyen dosyalarıda parse edecek ve içindeki herşeyi documente edecek code örnekleri varmı? İlgilenecek tüm arkadaşlara simdiden tesekkür ederim.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Mesaj gönderen ertank »

Merhaba,

Bildiğim kadarıyla IXMLDocument ile bunu yapamazsınız. Ancak IXMLDOMDocument ile bunu yapmanız mümkün olabilir.

Örnek olması açısından aşağıdaki kodu inceleyebilirsiniz.

Kod: Tümünü seç

uses
  msxml;

const
  TestXML = '<?xml version="1.0" encoding="utf-8" ?>' +
            '<items><item Id="814135481" Rank="1">' +
            '<a n="Formatted Name" v="Test Project 1"/></item>' +
            '<item Id="814135882" Rank="2">' +
            '<a n="Formatted Name" v="Test Project 2"/>' + '</item>' +
            '<item Id="814135908" Rank="3">' +
            '<a n="Formatted Name" v="Test Project 3"/>' +
            '</item></items>';

procedure TForm2.FormCreate(Sender: TObject);
var
  Xml: IXMLDOMDocument;
  ANode: IXMLDOMNode;
  I: Integer;
begin
  Memo1.Clear();
  Memo1.WordWrap := False;
  Memo1.Font.Name := 'Consolas';
  Memo1.ScrollBars := TScrollStyle.ssBoth;


  Xml := CoDOMDocument.Create();
  Xml.LoadXml(TestXML);

  ANode := Xml.documentElement.childNodes[0];
  Memo1.Lines.Add('NodeName: ' + ANode.nodeName + ', NodeValue: ' + VarToStr(ANode.nodeValue));
  for I := 0 to ANode.attributes.length-1 do
    Memo1.Lines.Add('    AttributeName: ' + ANode.attributes.item[I].nodeName + ', AttributeValue: ' + VarToStr(ANode.attributes.item[I].nodeValue));
end;
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Mesaj gönderen aegean »

:) Cevabınız için tesekkur ederim
Gercekten faydalı ama hala bir sorun daha var bu kod ile sizin ornek xml guzel okunabilir ama benim calsıtıgım yapıda sadece ilk nodu alıyor sonraki nodları almak için bir cok kod denemesi yaptım caşitli dongulere soktum ama nafile olmadı sanırım bir ornek xml versem daha anlamlı olacak sorum

Kod: Tümünü seç

<?xml version="1.0" encoding="UTF-8" ?><systems messageName="deviceResponse" messageID="39" xmlns="http://www.w3.org/2001/XMLSchema-instance">
  <deviceResponse result="OK">
    <device deviceIndex="1" deviceName="YYYYYYYYYYY" deviceParameterType="DeviceParameter">
      <supportedInterfaceModes>
        <interfaceMode mode="prn"/>
      </supportedInterfaceModes>
      <DeviceParameter supportsColor="none">
        <ipAndPort ip="10.34.248.11" port="17540" hostName="xxxxxxxxx"/>
        <pStatus desc="initializing..." init="true" paperOut="false" powerOff="false" ready="false" unknown="false" paperJam="false"/>
        <supportedStocks>
          <supportedStock supportsColor="none" stockWidth="203" stockHeight="76" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" perforationLeft="0"/>
        </supportedStocks>
      </DeviceParameter>
    </device>
  </deviceResponse>
</systems>
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Mesaj gönderen aegean »

Merhaba
Aslında bu xml ler için normalde xsd dosdyaları da mevcut ve diğer diller ile (Java gibi) bu konuda yazılan programlarda xsd ile validasyon da yapılmakta ama ben delphi ile xml ve xsd konusuna malesef cok bilgisizim, neler yapılabileceği hakkında dahi yeterli bilgiye ulaşamadım. Compilerin dökümantasyonunda da yeterli bilgi bulamayınca hüsrana ugramıstım. Eğer zaman ayırıp yardımcı olabilecek arkadaşlar varsa simdiden tesekkür ederim. Konuya örnek olabilecek Xml bir önceki mesajda mevcut.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Bilinmeyen Yapıda xml dosyası ayırma işlemleri

Mesaj gönderen mkysoft »

Delphi IDE'si ile gelen XML Data Binding (http://docwiki.embarcadero.com/RADStudi ... ing_Wizard) aracini kullanarak siniflarin olusturulmasini saglayabilirsiniz. Siniflar uzerinden calismak daha kolay olacaktir. Eger elinizde sema yoksa yine de IXMLDocument sinifi ile xmllei okuyabilir ya da olusturabilirsiniz. Surada (https://github.com/isisedonusum) e-fatura xmlleri icin yapilmis bazi ornekler mevcut. Delphi yillar icinde xml islemek icin farkli kutuphaneler kullandi, bu nedenle bulacaginiz ornekler sizin versiyonunuzda calismayabilir.
Cevapla