kater0815
Goto Top

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
 <?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  

Content-ID: 622980

Url: https://administrator.de/contentid/622980

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

Printe
Lösung Printe 18.11.2020 aktualisiert um 14:14:34 Uhr
Goto Top
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 auch
xml.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 Befehl
Set nodes = xml.selectNodes("//rsm:HeaderExchangedDocument")  

Hier auch noch was Hintergrundwissen zum Nachschlagen
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms756 ...
Printe
Printe 18.11.2020 aktualisiert um 14:27:51 Uhr
Goto Top
p.s. Bitte in Zukunft Codetags nutzen!

des Inhaltes umbennen
Und Rechtschreibung im Titel korrigieren!
Kater0815
Kater0815 18.11.2020 um 14:39:51 Uhr
Goto Top
Hallo Printe,

vielen, vielen Dank. Deine Hilfe hat mich schon sehr viel weiter gebracht.
Jetzt kann ich zumindest schon einmal alle Daten aus der XML-Datei auslesen und muss mich nur noch um die Schleife kümmern.

Codetags wäre eine gute Idee gewesen, muss ich dir Recht geben.
Printe
Printe 18.11.2020 aktualisiert um 15:00:34 Uhr
Goto Top
des Inhaltes umbennenen
Da hat ein Zwerg wohl noch einen Dreher eingebaut :-P.
Kater0815
Kater0815 18.11.2020 aktualisiert um 15:19:29 Uhr
Goto Top
Zwei Stunden Schlaf und viel Kopfzerbrechen kann schon einiges mit einem Mann anrichten.

Danke.