XML-Datein anhand des Inhaltes umbenennen
Hallo,
ich bin im Thema XML und VB-Skript noch ein Neuling und würde mich freuen wenn jemand mit etwas mehr Erfahrung meinem Hirn mal einen Schubs geben könnte.
In einen Ordner habe ich etliche XML-Dateien (ZUGFeRD) mit nichtssagenden Dateinamen, diese Dateien möchte ich anhand des Inhaltes der XML-Dateien umbenennen.
Aus dem Netz habe ich mir schon einiges an Code-Schnipsel zusammengesucht und habe versucht diese für mein Problem zu verwenden.
Nun komme ich an zwei Punkten nicht so recht weiter und würde mich über Hilfe freuen.
Punkt 1:
Ich kann auf die Daten des hinteren Teil der XML-Datei für Absenden, Empfänger etc. zugreifen. Bei den Daten für Rechnung (HeaderExchangedDocument) bekomme ich die Adressierung des Abschnittes nicht hin, sondern erhalte die Fehlermeldung „Verweis auf nicht deklariertes Namespace-Präfix“. Was läuft in diesem Bereich anders mit der Ansprache?
Punkt2:
Bisher hatte das Skript immer eine Datei ausgelesen. Um es mit der Schleife für alle Dateien hi zu bekommen muss ich scheinbar die xml.selectNodes in Objekte ändern, an diesem Punkt komme ich mit meinen Kenntnissen so recht weiter.
Unten habe ich einmal den Anfang der XML Datei und mein bisheriges Skript beigefügt.
mit freundlichen Grüßen
XML-Datei
Skript
ich bin im Thema XML und VB-Skript noch ein Neuling und würde mich freuen wenn jemand mit etwas mehr Erfahrung meinem Hirn mal einen Schubs geben könnte.
In einen Ordner habe ich etliche XML-Dateien (ZUGFeRD) mit nichtssagenden Dateinamen, diese Dateien möchte ich anhand des Inhaltes der XML-Dateien umbenennen.
Aus dem Netz habe ich mir schon einiges an Code-Schnipsel zusammengesucht und habe versucht diese für mein Problem zu verwenden.
Nun komme ich an zwei Punkten nicht so recht weiter und würde mich über Hilfe freuen.
Punkt 1:
Ich kann auf die Daten des hinteren Teil der XML-Datei für Absenden, Empfänger etc. zugreifen. Bei den Daten für Rechnung (HeaderExchangedDocument) bekomme ich die Adressierung des Abschnittes nicht hin, sondern erhalte die Fehlermeldung „Verweis auf nicht deklariertes Namespace-Präfix“. Was läuft in diesem Bereich anders mit der Ansprache?
Punkt2:
Bisher hatte das Skript immer eine Datei ausgelesen. Um es mit der Schleife für alle Dateien hi zu bekommen muss ich scheinbar die xml.selectNodes in Objekte ändern, an diesem Punkt komme ich mit meinen Kenntnissen so recht weiter.
Unten habe ich einmal den Anfang der XML Datei und mein bisheriges Skript beigefügt.
mit freundlichen Grüßen
XML-Datei
<?xml version="1.0" encoding="UTF-8"?>
<rsm:CrossIndustryDocument xmlns:rsm="urn:ferd:CrossIndustryDocument:invoice:1p0">
<rsm:SpecifiedExchangedDocumentContext>
<ram:BusinessProcessSpecifiedDocumentContextParameter xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<ram:ID>AR02</ram:ID>
</ram:BusinessProcessSpecifiedDocumentContextParameter>
<ram:GuidelineSpecifiedDocumentContextParameter xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<ram:ID>urn:ferd:CrossIndustryDocument:invoice:1p0:extended</ram:ID>
</ram:GuidelineSpecifiedDocumentContextParameter>
</rsm:SpecifiedExchangedDocumentContext>
<rsm:HeaderExchangedDocument>
<ram:ID xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">0000001</ram:ID>
<ram:Name xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">Rechnung_Name</ram:Name>
<ram:TypeCode xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">Rechnung_Typ</ram:TypeCode>
<ram:IssueDateTime xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<udt:DateTimeString xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15" format="102">20201031</udt:DateTimeString>
</ram:IssueDateTime>
<ram:CopyIndicator xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<udt:Indicator xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15">false</udt:Indicator>
</ram:CopyIndicator>
<ram:IncludedNote xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<ram:Content>Text</ram:Content>
<ram:SubjectCode>Text</ram:SubjectCode>
</ram:IncludedNote>
<ram:IncludedNote xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<ram:Content>Text</ram:Content>
</ram:IncludedNote>
<ram:SubjectCode>AAK</ram:SubjectCode>
</ram:IncludedNote>
</rsm:HeaderExchangedDocument>
<rsm:SpecifiedSupplyChainTradeTransaction>
<ram:ApplicableSupplyChainTradeAgreement xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12">
<ram:BuyerReference>Firma HRB 00000</ram:BuyerReference>
<ram:SellerTradeParty>
<ram:ID>Absender_ID</ram:ID>
<ram:Name>Absender_Name</ram:Name>
Skript
Dim Dateiname, DateinameNeu, xmlEingang, xmlAusgabe
Dim Rechnung_ID, Rechnung_Name, Rechnung_Typ, Rechnung_Datum, Absender_Name, Absender_Ort
xmlEingang = "C:\Temp\ZUGFERD\Eingang\"
xmlAusgabe = "C:\Temp\ZUGFERD\Ablage\"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set xmlEingang = fso.GetFolder(xmlEingang)
Set xml = CreateObject("Msxml2.DOMDocument.6.0")
xml.async = False
' For Each Dateiname In xmlEingang.Files
' If LCase(Right(Dateiname.Name,3)) = "xml" Then
' Set objXmlFile = fso.OpenTextFile(Dateiname.Path)
Dateiname = "AT000001.H0000001.INVZUGFPDF01.00001.xml"
xml.load(xmlEingang & Dateiname)
xml.setProperty "SelectionLanguage", "XPath"
xml.setProperty "SelectionNamespaces","xmlns:ram='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12'"
Set nodes = xml.selectNodes("//rsm:HeaderExchangedDocument/")
For Each node In nodes
Rechnung_ID = node.selectSingleNode("ram:ID").text
Rechnung_Name = node.selectSingleNode("ram:Name").text
Rechnung_Typ = node.selectSingleNode("ram:TypeCode").text
Rechnung_Datum = node.selectSingleNode("ram:IssueDateTime").text
Next
Set nodes = xml.selectNodes("//ram:SellerTradeParty")
For Each node In nodes
Absender_Name = node.selectSingleNode("ram:Name").text
Absender_Ort = node.selectSingleNode("ram:PostalTradeAddress/ram:CityName").text
Next
MsgBox "ID: " & Rechnung_ID & vbNewLine & _
"Name: " & Rechnung_Name & vbNewLine & _
"Typ: " & Rechnung_Typ & vbNewLine & _
"Datum: " & Rechnung_Datum & vbNewLine & vbNewLine & _
"Name: " & Absender_Name & vbNewLine & _
"Stadt: " & Absender_Ort & vbNewLine & vbNewLine & _
DateinameNeu = Rechnung_Name & "_" & Rechnung_ID & "_" & Rechnung_Datum & ".xml"
fso.CopyFile Dateiname.Path, xmlAusgabe & DateinameNeu
' End If
' Next
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 622980
Url: https://administrator.de/contentid/622980
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
5 Kommentare
Neuester Kommentar
xml.setProperty "SelectionNamespaces","xmlns:ram='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12'"
Na wenn du einen anderen Namespace mittels XPath ansprechen willst den du nicht deklariert hast dann wird das Selektieren mit SelectNodes auch kein Ergebnis liefern. In deinem Fall hast du den Namespace für rsm nicht in der Property definiert. Willst du also Ergebnisse aus einem anderen Namespace haben dann setze den entsprechend auchxml.setProperty "SelectionNamespaces","xmlns:rsm='urn:ferd:CrossIndustryDocument:invoice:1p0' xmlns:ram='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12'"
Set nodes = xml.selectNodes(" ;rsm:HeaderExchangedDocument/")
Außerdem ist hier auch ein XPATH Fehler im SelectNodes BefehlSet nodes = xml.selectNodes("//rsm:HeaderExchangedDocument")
Hier auch noch was Hintergrundwissen zum Nachschlagen
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms756 ...