riatnep
Goto Top

Inhalt bzw. Zeilen in XML File mit Script hinzufügen

Hallo zusammen,

ich habe schon ziemlich viel Zeit in diese Anforderung gesteckt, jedoch komme ich selbst nicht zur richtigen Lösung.
Wie kann ich in einer XML einige Zeilen zusätzlich per Script hinzufügen? Und in Zeile 5 <Msgid> sollen die "/" beim Datum entfernt werden.

Soll:
<?xml version="1.0" encoding="utf-8" ?> 
<Document>
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>20130619001</MsgId> 
<CreDtTm>2013-06-19T14:22:08</CreDtTm> 
<NbOfTxs>1</NbOfTxs> 
<CtrlSum>100.00</CtrlSum> 
<InitgPty>
<Nm>Company Name</Nm> 
<Id>
<OrgId>
<Othr>
<Id>123456789</Id> 
</Othr>
</OrgId>
</Id>
</InitgPty>
</GrpHdr>
</CstmrCdtTrfInitn>
</Document>

Ist:
<?xml version="1.0" encoding="utf-8" ?> 
<Document>
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>2013/06/19001</MsgId> 
<CreDtTm>2013-06-19T14:22:08</CreDtTm> 
<NbOfTxs>1</NbOfTxs> 
<CtrlSum>100.00</CtrlSum> 
<InitgPty>
<Nm>Company Name</Nm> 
</InitgPty>
</GrpHdr>
</CstmrCdtTrfInitn>
</Document>

Sprich die Zeilen von 11 bis 17 sollen immer nach <Nm Company Name </Nm> hinzugefügt werden. Diese hinzugefügten Zeilen sind fix und müssen nicht angepasst werden.
Die Datei mit dem neuen Inhalt soll als neue Datei im gleichen Verzeichnis mit anderem Namen abgelegt werden.

Ich habe versucht mich an diesen Beitrag zu halten:
Inhalt einer XML Datei per Batch bzw. Script ändern

Wäre super wenn Ihr Eure Ideen mit einbirngen könntet.

Viele Grüße
Steffen

Content-Key: 218653

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: colinardo
colinardo 07.10.2013 aktualisiert um 12:52:47 Uhr
Goto Top
Hallo Steffen,
probiers mal hiermit: (in Zeile 1 und 2 jeweils noch die Pfade anpassen)
strXMLINPUT = "c:\input.xml"  
strXMLOUTPUT = "c:\output.xml"  
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")  
xmlDoc.Load strXMLINPUT

'korrigiere MsgId  
Set nodeDatum = xmlDoc.selectSingleNode("/Document/CstmrCdtTrfInitn/GrpHdr/MsgId")  
nodeDatum.firstChild.nodeValue= Replace(nodeDatum.firstChild.nodeValue,"/","")  

'hole Referenz zum Einfüge-Element in das die neuen Elemente eingefügt werden  
Set insertNode = xmlDoc.selectSingleNode("/Document/CstmrCdtTrfInitn/GrpHdr/InitgPty")  

'erzeuge Elemente  
Set node_Id = xmlDoc.createElement("Id")  
Set node_OrgId = xmlDoc.createElement("OrgId")  
Set node_Othr = xmlDoc.createElement("Othr")  
Set node_Othr_Id = xmlDoc.createElement("Id")  
Set node_Othr_Id_Text = xmldoc.createTextNode("123456789")  

'hänge die Elemente aneinander   
node_Othr_Id.appendChild(node_Othr_Id_Text)
node_Othr.appendChild(node_Othr_Id)
node_OrgId.appendChild(node_Othr)
node_Id.appendChild(node_OrgId)
insertNode.appendChild(node_Id)

' Stylesheet: XML Dokument schön formatieren  
Set oXsltDoc = CreateObject("Msxml2.DOMDocument.6.0")  
oXsltDoc.async = False
oXsltDoc.loadXML( _
  "<?xml version=""1.0"" encoding=""windows-1252""?>" & vbNewLine & _  
  "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbNewLine & _  
  "	<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />" & vbNewLine & _  
  "	<xsl:template match=""node()|@*"">" & vbNewLine & _  
  "		<xsl:copy>" & vbNewLine & _  
  "			<xsl:apply-templates select=""node()|@*"" />" & vbNewLine & _  
  "		</xsl:copy>" & vbNewLine & _  
  "	</xsl:template>" & vbNewLine & _  
  "</xsl:stylesheet>")  
xmlDoc.transformNodeToObject oXsltDoc, xmlDoc

'speichere XML als neues Dokument  
xmlDoc.save(strXMLOUTPUT)

Set xmlDoc = Nothing
Set oXsltDoc = Nothing

Grüße Uwe
Mitglied: riatnep
riatnep 07.10.2013 um 16:13:06 Uhr
Goto Top
Hallo Uwe,

vielen Dank. Dein Script funktioniert wunderbar.

Leider habe ich bei meinem oberen Post die XML ein bisschen gekürzt.

Der Kopf der XML ist im Original nicht

<?xml version="1.0" encoding="utf-8" ?> 
<Document>

sondern
<?xml version="1.0" encoding="utf-8"?>  
<!-- Created with Liquid XML Studio - FREE Community Edition 7.1.6.1440 (http://www.liquid-technologies.com) -->
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.002.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.002.03 pain.001.002.03.xsd">  

wenn ich <Document> anpasse funktioniert es. Jedoch steht hier leider noch der Rattenschwanz dahinter. Hast du hierfür noch eine Lösung?

Viele Grüße
Steffen
Mitglied: colinardo
colinardo 07.10.2013, aktualisiert am 08.10.2013 um 08:22:02 Uhr
Goto Top
Hallo Steffen,
leider ist das XML-DOM-Objekt bei Namespaces sehr zickig. Daher ist es bei solchen Aufgaben essentiell, eventuell vorkommenden Namespaces zu erwähnen !

Für deinen Fall und wenn die nachfolgenden Elemente keine weiteren anderen Namespaces haben, müsste das hier funktionieren(außer du hast noch mehr Überraschungen parat face-wink):
strXMLINPUT = "c:\input.xml"  
strXMLOUTPUT = "c:\output.xml"  
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")  
xmldoc.validateOnParse = False
xmlDoc.async = False
xmlDoc.Load strXMLINPUT
If xmlDoc.parseError.errorCode <> 0 Then
	WScript.Echo xmlDoc.parseError.reason
	WScript.Quit 1
End If
'Setze Namespaces  
strNS = "urn:iso:std:iso:20022:tech:xsd:pain.001.002.03"  
xmlDoc.setProperty "SelectionLanguage", "XPath"  
xmlDoc.setProperty "SelectionNamespaces", "xmlns:default=""" & strNS & """"  

Set oDoc = xmlDoc.documentElement

'korrigiere MsgId  
Set nodeDatum = oDoc.selectSingleNode("//default:MsgId")  
nodeDatum.firstChild.nodeValue= Replace(nodeDatum.firstChild.nodeValue,"/","")  

'hole Referenz zum Einfüge-Element in das die neuen Elemente eingefügt werden  
Set insertNode = oDoc.selectSingleNode("//default:InitgPty")  

'erzeuge Elemente  
Set node_Id = xmlDoc.createNode(1,"Id",strNS)  
Set node_OrgId = xmlDoc.createNode(1,"OrgId",strNS)  
Set node_Othr = xmlDoc.createNode(1,"Othr",strNS)  
Set node_Othr_Id = xmlDoc.createNode(1,"Id",strNS)  
Set node_Othr_Id_Text = xmldoc.createTextNode("123456789")  

'hänge die Elemente aneinander   
node_Othr_Id.appendChild(node_Othr_Id_Text)
node_Othr.appendChild(node_Othr_Id)
node_OrgId.appendChild(node_Othr)
node_Id.appendChild(node_OrgId)
insertNode.appendChild(node_Id)

' Stylesheet: XML Dokument schön formatieren  
Set oXsltDoc = CreateObject("Msxml2.DOMDocument.6.0")  
oXsltDoc.async = False
oXsltDoc.loadXML( _
  "<?xml version=""1.0"" encoding=""windows-1252""?>" & vbNewLine & _  
  "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbNewLine & _  
  "	<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />" & vbNewLine & _  
  "	<xsl:template match=""node()|@*"">" & vbNewLine & _  
  "		<xsl:copy>" & vbNewLine & _  
  "			<xsl:apply-templates select=""node()|@*"" />" & vbNewLine & _  
  "		</xsl:copy>" & vbNewLine & _  
  "	</xsl:template>" & vbNewLine & _  
  "</xsl:stylesheet>")  
xmlDoc.transformNodeToObject oXsltDoc, xmlDoc

'speichere XML als neues Dokument  
xmlDoc.save(strXMLOUTPUT)

Set xmlDoc = Nothing
Set oXsltDoc = Nothing

Grüße Uwe
Mitglied: riatnep
riatnep 08.10.2013 um 08:18:59 Uhr
Goto Top
Hallo Uwe,

nun funktioniert alles einwandfrei! Vielen Dank für die tolle Unterstützung.

Viele Grüße
Steffen