locxar
Goto Top

Aus einer XML-Datei mehrere Daten auslesen und in einer bestimmten Syntax in eine Excel-Datei speichern

Guten Tag,

ich habe hier eine xml datei (ausschnitt am ende meines Posts) in der Daten aus einer Datenbank gespeichert werden. unter CUSTS > CUST > BILLING_ADDRESS sind 2 Tags die ich brauche, NAME1 und PHONE1 die müsste ich auslesen und in eine excel Tabelle einfügen, wo sie dann NUR in der ersten Spalte gespeichert werden sollen. Die erste Zeile bleibt frei und danach bekommt jedes NAME1/PHONE1 Paar eine Zeile die so aufgebaut sein muss:
NAME1,,,"PHONE1","NAME1"  

aus der Telefonnummer der XML Datei muss auch noch das / entfernt werden.

<!DOCTYPE CUSTS SYSTEM "Customer.dtd" >  
<CUSTS>
	<CUST>
		<CUSTID></CUSTID>
		<DESC></DESC>
		<CURR></CURR>
		<TAX></TAX>
		<EUVAT/>
		<A1TAXATION></A1TAXATION>
		<PLACEOFUNLOADING/>
		<PLANTKEY/>
		<PAYTERMS></PAYTERMS>
		<PAYMODE/>
		<PAYDAYS></PAYDAYS>
		<CASHDISCDAY1></CASHDISCDAY1>
		<CASHDISCDAY2></CASHDISCDAY2>
		<CASHDISCPER1></CASHDISCPER1>
		<CASHDISCPER2></CASHDISCPER2>
		<PAYBEHAV/>
		<LOCKED></LOCKED>
		<DISC></DISC>
		<SALESAGENT></SALESAGENT>
		<PRICELIST></PRICELIST>
		<DISCLIST></DISCLIST>
		<PROCEEDCODE></PROCEEDCODE>
		<ISCOMMISSION></ISCOMMISSION>
		<PRICEFLAG></PRICEFLAG>
		<DISCGROUP/>
		<REFERENZ/>
		<REFERENZNR/>
		<HOMEPAGE/>
		<LETTERADDRESS/>
		<LANGUAGE></LANGUAGE>
		<ADDRESSAWKZ/>
		<KTOAWKZ/>
		<ADDRESSGROUP></ADDRESSGROUP>
		<KTOGROUP/>
		<CONTACT></CONTACT>
		<MEMOKTO/>
		<FORMULAR/>
		<KTOTYP/>
		<KOSTENSTELLE/>
		<KOSTENTRAEGER/>
		<TRANSPORTMODE/>
		<BUSINESSTYPE/>
		<TOUR></TOUR>
		<SHIPMENTTYPE/>
		<DELIVERYCOND/>
		<PARTDELIVERY></PARTDELIVERY>
		<BILLING_ADDRESS>
			<ADDRESS/>
			<NAME1>Name</NAME1>
			<NAME2></NAME2>
			<NAME3/>
			<STREET/>
			<ZIP/>
			<CITY/>
			<COUNTRY/>
			<PHONE1>0123/456789</PHONE1>
			<PHONE2/>
			<FAX>0123/4567890</FAX>
			<EMAIL/>
		</BILLING_ADDRESS>
		<SHIPPING_ADDRESS>
			<ADDRESS/>
			<NAME1></NAME1>
			<NAME2></NAME2>
			<NAME3/>
			<STREET></STREET>
			<ZIP></ZIP>
			<CITY></CITY>
			<COUNTRY></COUNTRY>
			<PHONE1></PHONE1>
			<PHONE2/>
			<FAX></FAX>
			<EMAIL/>
		</SHIPPING_ADDRESS>
		<PERSONTOTURNTO>
			<PERSON2TURN2></PERSON2TURN2>
			<GROUP/>
			<TITLE/>
			<PNAME1/>
			<PNAME2/>
			<POSITION></POSITION>
			<DIVISION/>
			<LETTERADDRESS1/>
			<LETTERADDRESS2></LETTERADDRESS2>
			<LETTERADDRESS3></LETTERADDRESS3>
			<PPHONE/>
			<PFAX/>
			<PMOBIL/>
			<PHONEPRIVAT/>
			<PHONECAR/>
			<PEMAIL/>
			<BIRTHDAY/>
			<PMEMO/>
		</PERSONTOTURNTO>
	</CUST>
	<CUST>
...
Dieses Muster wiederholt sich unbestimmt oft!
Ich hoffe das mir jemand bei meinem Problem helfen kann und bedanke mich schonmal im vorraus für die Hilfe!

Mit freundlichen Grüßen
LocXar

Content-Key: 251868

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

Printed on: April 25, 2024 at 21:04 o'clock

Member: colinardo
Solution colinardo Oct 14, 2014, updated at Oct 15, 2014 at 06:56:36 (UTC)
Goto Top
Hallo LocXar,
kannst du mit folgendem Code in einem Excel-Dokument machen (In Zeile 4 den Pfad zu XML-Datei eingeben):
Sub ImportXMLData()
    Dim ws As Worksheet, rngOut As Range, fso as Object, xmldoc as Object, strContent as Variant
    'Pfad zur XML-Datei  
    Const XMLPATH = "C:\temp\customers.xml"  
    
    'Objekte erstellen  
    Set fso = CreateObject("Scripting.Filesystemobject")  
    Set xmldoc = CreateObject("msxml2.domdocument.6.0")  

    'Anfangszelle des Ausgabebereichs bestimmen Tabellenblatt 1 Zelle A2  
    Set rngOut = Sheets(1).Range("A2")  

    'XML-Datei einlesen und die erste Zeile 'wegsplitten' damit das Dokument vom XML-Object korrekt interpretiert werden kann (Die DTD stört in diesem Fall in der Definition)  
    strContent = Split(fso.OpenTextFile(XMLPATH).ReadAll(), vbNewLine, 2)
    xmldoc.validateOnParse = False
    xmldoc.LoadXML (strContent(1))

    'gewünschte Nodes mit XPATH selektieren  
    Set Nodes = xmldoc.SelectNodes("/CUSTS/CUST/BILLING_ADDRESS")  

    'für jeden gefundenen Knoten ...  
    For Each Node In Nodes
        'Werte der gewünschten Elemente holen  
        strNAME1 = Node.SelectSingleNode("NAME1").Text  
        'Slashes in der Telefonnummer ersetzen  
        strPHONE1 = Replace(Node.SelectSingleNode("PHONE1").Text, "/", "", 1, -1, vbTextCompare)  

        'Werte in die Ausgabezeile schreiben  
        rngOut.Value = strNAME1 & ",,,""" & strPHONE1 & """,""" & strNAME1 & """"  

        'Zeile um eins nach unten verschieben  
        Set rngOut = rngOut.Offset(1, 0)
    Next

    'Objekte releasen  
    Set xmldoc = Nothing
    Set fso = Nothing
End Sub
Grüße Uwe
Member: LocXar
LocXar Oct 15, 2014 updated at 06:56:29 (UTC)
Goto Top
danke ich werde es gleich mal ausprobieren!


EDIT: Danke! Das Skript funktioniert super! Und danke für die beschriftungen der einzelnen Vorgänge!

MfG
LocXar