August 15, 2020, 07:13:26

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Import von XML

Begonnen von Bopi, Juli 24, 2020, 11:46:14

⏪ vorheriges - nächstes ⏩

Bopi

Ich habe noch keine Erfahrung betreffend xml.
Hier mein Problem: Die xml-Datei hat am Anfang einen Tag, welcher die Info zum Schema enthält.
Ich lade die Datei in den Speicher und versuche die einzelnen Tags auszulesen.
Solange der Tag mit dem Schema keine Informationen enthält oder nicht vorhanden ist, funktioniert das wie gewünscht. Aber mit den Schema Informationen tut sich nichts, d.h. Access erkennt keine ChildNodes.

Beispiel der xml:
<?xml version="1.0"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04 camt.054.001.04.xsd">
<BkToCstmrDbtCdtNtfctn>
<GrpHdr>
<MsgId>2020061775204228731867</MsgId>
<CreDtTm>2020-06-17T23:33:09</CreDtTm>
<MsgPgntn>
<PgNb>1</PgNb>
<LastPgInd>true</LastPgInd>
</MsgPgntn>
<AddtlInf>SPS/1.6/PROD</AddtlInf>
</GrpHdr>
<Ntfctn>
<Id>20200617375204228731887</Id>
<CreDtTm>2020-06-17T23:33:09</CreDtTm>...
Sieht die 2. Zeile dann so aus: <Document>, dann funktioniert es, aber nicht wenn es so wie oben aussieht.
Kann mir das jemand erklären, oder aufzeigen was ich falsch mache?

Hier mein Code, (beim Laden des Formulars):

Private Sub Form_Load()
Dim objXMLNode As IXMLDOMNode
Dim nodeBook As IXMLDOMNode
Dim lstNodes As IXMLDOMNodeList

          Set objXML = New MSXML2.DOMDocument60
          objXML.validateOnParse = True           'Struktur und Daten beim Laden prüfen
          objXML.SetProperty "SelectionLanguage", "XPath"             'echtes XPath verwenden um Nodes zu selektieren
          'Dokument laden
          If Not objXML.Load(Application.CurrentProject.Path & strFile) Then
                    MsgBox "Fehler beim Laden des Dokuments." & vbCrLf _
                              & "Grund: " & objXML.parseError.reason & vbCrLf _
                              & "Zeile: " & objXML.parseError.Line, vbOKOnly Or vbExclamation, "Fehler"
                    Set objXML = Nothing
          End If
          Me.txtPfad = Application.CurrentProject.Path & strFile
          Me.txtXML = objXML.XML
          Set XMLNodes = objXML.getElementsByTagName("*")
          Set lstNodes = objXML.selectNodes("//Id")
          For Each nodeBook In lstNodes
                    Debug.Print fullName(nodeBook) & ": " & nodeBook.Text
          Next
         
End Sub

txtPfad und txtXML sind Felder auf dem Formular.
fullName ist eine kleine Funktion, welche Parent und Child Adresse des Knotens zurückgibt:
Public Function fullName(node As MSXML2.IXMLDOMNode) As String

          If node.parentNode Is Nothing Then
                    fullName = "/"
          Else
                    fullName = fullName(node.parentNode) & "/" & node.nodeName
          End If
         
End Function

crystal

Und was passiert, wenn du
objXML.validateOnParse = False
setzt?

(Der XML-Parser, der in Access benutzt wird, überprüft/berücksichtigt möglicherweise nicht die Direktiven/Regeln, die im <Document>-Statement angegeben werden. Wäre vielleicht auch zu viel verlangt, weil dann jeweils Direktiven nachgeladen werden müssten.)

Oder liegt es hier:
                    Debug.Print fullName(nodeBook) & ": " & nodeBook.Text
was vielleicht lauten sollte
                    Debug.Print fullName(nodeBook) & ": " & fullname(nodeBook).Text
?

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Bopi

Vielen Dank für Deine Antwort.
Ersteres habe ich schon getestet. Ändert aber nichts.
Zweiteres werde ich testen, könnte eine Antwort sein.
Ich bin inzwischen auf einen möglichen Lösungsansatz gestossen. Wenn der erfolgreich ist, lasse ich es Euch wissen.