xml'den veri almak

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Merhaba,

Aşağıdaki xml satırından cbc:Description languageID="TR" alanını nasıl veri olarak alabilirim.
Aşağıdaki kodu denedim ama hata verdi.

Kod:
-<cac:Item>
<cbc:Description languageID="TR">34GY5952 FORD FOCUS 1.5L TDCI 120PS TREND X POWERSHIFT Giris:- Cikis: 2019-01-28 09:01:14.000-15 TEMMUZ ŞEHİTLER K</cbc:Description>
Kod:
Set MyAttribute = xDoc.SelectNodes("//cac:item/cbc:Description languageID[='TR']/")
 

Ekli dosyalar

Son düzenleme:

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,614
Excel Vers. ve Dili
Pro Plus 2021
2016 yılında bir soruya karşılık yazdığım bir kod ama yayınlamamıştım.
Kod:
Sub xmlOku()
    Dim fso As Object, MyFolder As Object, MyFile As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set domObj = CreateObject("Msxml2.DOMDocument.6.0")
 
    Range("2:" & Rows.Count).ClearContents

    sat = 2
    Set MyFolder = fso.getfolder(ThisWorkbook.Path)
    For Each MyFile In MyFolder.Files
        If fso.GetExtensionName(MyFile) = "xml" Then
            domObj.Load (MyFile)

            Set elem = domObj.getElementsByTagName("cbc:ProfileID")(0)
            Cells(sat, 1) = elem.Text

            Set elem = domObj.getElementsByTagName("cbc:ID")(0)
            Cells(sat, 2) = elem.Text

            Set elem = domObj.getElementsByTagName("cbc:IssueDate")(0)
            Cells(sat, 3) = elem.Text

            Set elem = domObj.getElementsByTagName("cac:PartyIdentification")
            Cells(sat, 4) = elem(3).Text

            Set elem = domObj.getElementsByTagName("cac:PartyName")(1)
            Cells(sat, 5) = elem.Text

            Set elem = domObj.getElementsByTagName("cac:InvoiceLine")
            
            For Each invoiceSatir In elem
                sat = sat + 1
                Set aciklama = invoiceSatir.getElementsByTagName("cbc:Description")(0)
              If Not aciklama Is Nothing Then Cells(sat, 5) = aciklama.Text
                Set tax = invoiceSatir.getElementsByTagName("cac:TaxSubtotal")
                Set matrah = tax(0).getElementsByTagName("cbc:TaxableAmount")(0)
                Cells(sat, 6) = matrah.Text
                Set oran = tax(0).getElementsByTagName("cbc:Percent")(0)
                Cells(sat, 7) = oran.Text
                Set vergi = tax(0).getElementsByTagName("cbc:TaxAmount")(0)
                Cells(sat, 8) = vergi.Text
                Cells(sat, 9) = CDbl(matrah.Text) + CDbl(vergi.Text)
            Next invoiceSatir
            sat = sat + 1
        End If
    Next
    Set MyFolder = Nothing
    Set fso = Nothing
    Set MyFile = Nothing

End Sub
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Merhaba,

Veysel Beyin XML tekniğine alternatif olarak, ben de Regular Expressions kullanarak söz konusu alandaki verileri alan bir alternatif hazırladım.

Dosya ektedir...

.
 

Ekli dosyalar

Son düzenleme:

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Haluk bey,

SelectNodes yöntemi ile yapılabilir mi?
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Erdem Bey;

Ekli dosyada, hem RegExp hem de bahsettiğiniz SelectNodes yönteminin kullanıldığı XML kodlaması ile çözümler vardır.

.
 

Ekli dosyalar

Son düzenleme:

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Haluk bey elinize sağlık.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Teşekkürler Erdem Bey.

Bu arada; 6 No'lu mesaj ekindeki dosyayı güncelledim ve XML dokümanında cbc: Description düğümünde languageID attribute değeri "TR" olanların XPATH ile listelenmesini sağlayan bir opsiyon ilave ettim.

.
 
Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,286
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Test etme imkanım olmadı ama, NameSpace içeren xml dosyalarında XPath ile sorgu yapılırken Haluk Bey'in kodu muhtemelen hata verecektir. Eğer hata oluşursa aşağıdaki kod satırında gerekli değişklikleri yaparak SelectNodes metodu çağrılmadan önce kullanılması gerekir.

PHP:
xDoc.SetProperty "SelectionNamespaces", "xmlns:cac='...' xmlns:cbc='...'"
 

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Zeki bey uyarınız için teşekkür ederim.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Test etme imkanım olmadı ama, NameSpace içeren xml dosyalarında XPath ile sorgu yapılırken Haluk Bey'in kodu muhtemelen hata verecektir. Eğer hata oluşursa aşağıdaki kod satırında gerekli değişklikleri yaparak SelectNodes metodu çağrılmadan önce kullanılması gerekir.

PHP:
xDoc.SetProperty "SelectionNamespaces", "xmlns:cac='...' xmlns:cbc='...'"

Üstad, 1. mesajda örnek olarak verilen XML dosyasında bir problem olmadı.... Ya da; demek istediğini ben anlamadım.:unsure:

.
 

outsider

Altın Üye
Katılım
16 Nisan 2005
Mesajlar
2
Altın Üyelik Bitiş Tarihi
12-09-2024
selamlar,

uzun zaman olmuş ancak @veyselemre hocanın yayınladığı kodla ilgili bir sorum var, yardımcı olabileceklere şimdiden teşekkürler.

bu kodlarda, xml dosyalarının olduğu klasör hedef gösterilmeden, kullanıcı tarafından seçilebilir mi? birkaç folderpicker kodu denedim ama başarılı olamadım.

herşey tamamen çalışıyor ancak klasör de seçilebilirse çok iyi olacak çalışmam için. yardımcı olabilecek var mıdır?


Kod:
Sub xmlOku()
    Dim fso As Object, MyFolder As Object, MyFile As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set domObj = CreateObject("Msxml2.DOMDocument")
 
    Range("2:" & Rows.Count).ClearContents
    
    

    sat = 2
    Set MyFolder = fso.GetFolder(ThisWorkbook.Path & "\" & "faturalar\")
 
    
    For Each MyFile In MyFolder.Files
        If fso.GetExtensionName(MyFile) = "xml" Then
            domObj.Load (MyFile)
            
            Set elem = domObj.SelectSingleNode("//cac:PartyName/cbc:Name")
            Cells(sat, 1) = elem.Text
            
            Set elem = domObj.getElementsByTagName("cbc:ID")(0)
            Cells(sat, 2) = elem.Text

            Set elem = domObj.getElementsByTagName("cbc:IssueDate")(0)
            Cells(sat, 3) = elem.Text
            
            Set elem = domObj.SelectSingleNode("//cac:Item/cbc:Name")
            Cells(sat, 4) = elem.Text

            Set elem = domObj.getElementsByTagName("cbc:InvoicedQuantity")(0)
            Cells(sat, 5) = elem.Text

            Set elem = domObj.SelectSingleNode("//cac:DespatchDocumentReference/cbc:ID")
            Cells(sat, 6) = elem.Text
            
            sat = sat + 1
        End If
    Next
    Set MyFolder = Nothing
    Set fso = Nothing
    Set MyFile = Nothing

End Sub
 
Üst