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

Printed on: April 19, 2024 at 20:04 o'clock

Member: colinardo
colinardo Oct 07, 2013 updated at 10:52:47 (UTC)
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
Member: riatnep
riatnep Oct 07, 2013 at 14:13:06 (UTC)
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
Member: colinardo
colinardo Oct 07, 2013, updated at Oct 08, 2013 at 06:22:02 (UTC)
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
Member: riatnep
riatnep Oct 08, 2013 at 06:18:59 (UTC)
Goto Top
Hallo Uwe,

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

Viele Grüße
Steffen