• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

xml'den veri almak

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,677
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:
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:
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:
Haluk bey,

SelectNodes yöntemi ile yapılabilir mi?
 
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:
Haluk bey elinize sağlık.
 
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:
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='...'"
 
Zeki bey uyarınız için teşekkür ederim.
 
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:

.
 
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
 
Geri
Üst