# SEPA XML file



## Maxl (12. Mrz 2014)

Hallo zusammen,

wollte mich mal erkundigen, ob sich von euch schonmal jemand mit der Generierung eines XML file's für das SEPA Lastschrift verfahren beschäftigt hat ?!

Habe gesehen, dass es für php Funktionen und Klassen dafür gibt... Für java habe ich allerdings nichts der gleichen gefunden ?!

Bin um jeden Rat / Tipp / Hinweis dankbar...

Grüße
Max


----------



## stg (12. Mrz 2014)

Ich denke du musst konkreter werden. Was genau hast du vor? Was genau ist das Problem?

Für den Umgang mit XML-Files gibt es jedenfalls einiges. Was die Daten darin genau bedeuten ist da ja zunächst mal unerheblich, die Interpretation dieser erfolgt ja dann hinterher sowieso in der BusinessLogik.


----------



## Maxl (12. Mrz 2014)

Ich möchte ein XML File erstellen in dem mehrer SEPA Lastschrifttransaktionen enthalten sind.
Die Daten für die einzelnen "Schuldner" hole ich aus einer DB bzw. generiere ich in dem programm bevor das xml file befüllt werden soll.

Mich würde interessieren wie ich am schnellsten bzw. am einfachsten das XML File erstellen mit den verschiedenen Elementen.
Die Datei soll dann etwa so aussehen:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsdain.008.002.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsdain.008.002.02 pain.008.002.02.xsd">
	<CstmrDrctDbtInitn>
		<GrpHdr>
			<MsgId>Message-ID</MsgId>
			<CreDtTm>2010-11-21T09:30:47.000Z</CreDtTm>
			<NbOfTxs>2</NbOfTxs>
			<InitgPty>
				<Nm>Initiator Name</Nm>
			</InitgPty>
		</GrpHdr>
		<PmtInf>
			<PmtInfId>Payment-ID</PmtInfId>
			<PmtMtd>DD</PmtMtd>
			<NbOfTxs>2</NbOfTxs>
			<CtrlSum>6655.86</CtrlSum>
			<PmtTpInf>
				<SvcLvl>
					<Cd>SEPA</Cd>
				</SvcLvl>
				<LclInstrm>
					<Cd>CORE</Cd>
				</LclInstrm>
				<SeqTp>FRST</SeqTp>
			</PmtTpInf>
			<ReqdColltnDt>2010-12-03</ReqdColltnDt>
			<Cdtr>
				<Nm>Creditor Name</Nm>
			</Cdtr>
			<CdtrAcct>
				<Id>
					<IBAN>DE87200500001234567890</IBAN>
				</Id>
			</CdtrAcct>
			<CdtrAgt>
				<FinInstnId>
					<BIC>BANKDEFFXXX</BIC>
				</FinInstnId>
			</CdtrAgt>
			<ChrgBr>SLEV</ChrgBr>
			<CdtrSchmeId>
				<Id>
					<PrvtId>
						<Othr>
							<Id>DE00ZZZ00099999999</Id>
							<SchmeNm>
								<Prtry>SEPA</Prtry>
							</SchmeNm>
						</Othr>
					</PrvtId>
				</Id>
			</CdtrSchmeId>
			<DrctDbtTxInf>
				<PmtId>
					<EndToEndId>OriginatorID1234</EndToEndId>
				</PmtId>
				<InstdAmt Ccy="EUR">6543.14</InstdAmt>
				<DrctDbtTx>
					<MndtRltdInf>
						<MndtId>Mandate-Id</MndtId>
						<DtOfSgntr>2010-11-20</DtOfSgntr>
						<AmdmntInd>true</AmdmntInd>
						<AmdmntInfDtls>
							<OrgnlCdtrSchmeId>
								<Nm>Original Creditor Name</Nm>
								<Id>
									<PrvtId>
										<Othr>
											<Id>AA00ZZZOriginalCreditorID</Id>
											<SchmeNm>
												<Prtry>SEPA</Prtry>
											</SchmeNm>
										</Othr>
									</PrvtId>
								</Id>
							</OrgnlCdtrSchmeId>
						</AmdmntInfDtls>
					</MndtRltdInf>
				</DrctDbtTx>
				<DbtrAgt>
					<FinInstnId>
						<BIC>SPUEDE2UXXX</BIC>
					</FinInstnId>
				</DbtrAgt>
				<Dbtr>
					<Nm>Debtor Name</Nm>
				</Dbtr>
				<DbtrAcct>
					<Id>
						<IBAN>DE21500500009876543210</IBAN>
					</Id>
				</DbtrAcct>
				<UltmtDbtr>
					<Nm>Ultimate Debtor Name</Nm>
				</UltmtDbtr>
				<RmtInf>
					<Ustrd>Unstructured Remittance Information</Ustrd>
				</RmtInf>
			</DrctDbtTxInf>
			<DrctDbtTxInf>
				<PmtId>
					<EndToEndId>OriginatorID1235</EndToEndId>
				</PmtId>
				<InstdAmt Ccy="EUR">112.72</InstdAmt>
				<DrctDbtTx>
					<MndtRltdInf>
						<MndtId>Other-Mandate-Id</MndtId>
						<DtOfSgntr>2010-11-20</DtOfSgntr>
						<AmdmntInd>false</AmdmntInd>
					</MndtRltdInf>
				</DrctDbtTx>
				<DbtrAgt>
					<FinInstnId>
						<BIC>SPUEDE2UXXX</BIC>
					</FinInstnId>
				</DbtrAgt>
				<Dbtr>
					<Nm>Other Debtor Name</Nm>
				</Dbtr>
				<DbtrAcct>
					<Id>
						<IBAN>DE21500500001234567897</IBAN>
					</Id>
				</DbtrAcct>
				<UltmtDbtr>
					<Nm>Ultimate Debtor Name</Nm>
				</UltmtDbtr>
				<RmtInf>
					<Ustrd>Unstructured Remittance Information</Ustrd>
				</RmtInf>
			</DrctDbtTxInf>
		</PmtInf>
	</CstmrDrctDbtInitn>
</Document>[/XML]

Gruß
Max


----------



## stg (12. Mrz 2014)

Ist nur ein wenig Fleißarbeit. Siehe z.B. hier How to create XML file in Java ? (DOM Parser)

Sofern du für den Krams bereits passende Datenhaltungsklassen hast, die die genaue Struktur des XML-Files widerspiegeln, die du haben willst, so ist auch JAXB interessant
JAXB: Speichern von Java Objekten als XML


----------



## Maxl (12. Mrz 2014)

Das hab ich auch schon gefunden... wollte irgendwie vermeiden das alles "manuell" zu erstellen...
Dann werd ich mich mal an die "Fleißarbeit"  machen 

Danke für die Bemühungen...

Grüße


----------



## Maxl (7. Apr 2014)

Hallo zusammen,

ich hänge leider schon wieder und zwar mit bei Thema Schema, Namespace usw. !
Erstelle mein XML File per Hand folgendermaßen(ausschnitt):

```
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
			Document document = documentBuilder.newDocument();
			
			documentFactory.setNamespaceAware(true);
			documentFactory.setValidating(true);
			documentFactory.setAttribute("urn:iso:std:iso:20022:tech:xsd:pain.008.002.02", "http://www.w3.org/2001/XMLSchema-instance");

			
			// root element
			Element root = document.createElement("Document");
			document.appendChild(root);

TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(document);
			StreamResult streamResult = new StreamResult(new File(xmlFilePath));

			transformer.transform(domSource, streamResult);
```

Wie kann ich meinem root element folgendes zuweisen... ?!
[XML]Document xmlns="urn:iso:std:iso:20022:tech:xsdain.008.002.02" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsdain.008.002.02 pain.008.002.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">[/XML]

Gruß
Max


----------



## ARadauer (7. Apr 2014)

Ich würde es mit jaxb machen. Aber im Grunde hat Maxl schon recht, wäre natürlich praktisch wenn es hier schon eine fertige API geben würde..


----------



## Maxl (7. Apr 2014)

Habe nun eine Lösung gefunden... wenn es jemanden interessiert ->


```
// root element
		   	Element root = document.createElementNS("http://www.w3.org/2001/XMLSchema-instance", "Document");
			root.setAttributeNS("urn:iso:std:iso:20022:tech:xsd:pain.008.002.02",
		            "xsi:schemaLocation","urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd");
			document.appendChild(root);
```

Gruß
Max


----------



## senior.weber (28. Dez 2014)

Hallo Maxl,

würdest du deinen kompletten Sepa Code einem Opensource Projekt (Openyabs by anti43) zur Verfügung stellen?

Beste Grüße

Andreas


----------



## dzim (5. Jan 2015)

Gibt es für das XML kein Schema? Oder wenigstens eine DTD? Wenn ja, dann wäre es mittels xjc recht einfacht die JAXB-Klassen daraus zu generieren. Irgendwo muss das Format ja irgendwie spezifiziert werden, oder?


----------



## senior.weber (6. Jan 2015)

KLar,

https://github.com/willuhn/hbci4java/blob/master/src/pain.008.002.02.xsd


aber ich habe leider keine Zeit, alles manuell zu machen. Deshalb hatte ich gehofft. vom Thread-Ersteller den passenden Code zu bekommen - wie gesagt für das Opensource Projekt Openyabs


----------



## dzim (6. Jan 2015)

Moinsen.

Ich weiss jetzt zwar nicht, wo das Problem darin liegt, einen simplen XJC-Befehl abzusetzen, aber hier mal meine Anleitung:

```
xjc -p enoa.sepa.schema.model -d . pain.008.002.02.xsd
```

Ich hoffe das mit dem Anhang klappt, wenn ja: Es enthält dein Schema-File, das Package 
*enoa.sepa.schemal.model* mit alles ORM-Java-Dateien, sowie ein (Beispiel-)Ant-File (*build_model.xml*), dass dir das automatisierte Übersetzen ermöglicht (und auch schaut, ob du auf Windows (*xjc.exe*) oder nicht (Linux/Mac - *xjc*) bist.
XJC ist Teil des JDKs (im *bin*-Ordner des selbigen).

Was du nun noch machen musst, ist das Marschalling (das serialisieren des Models, also der Java-Objekte nach XML), bzw. das Unmarshalling.
Das Tutorial von Lars Vogel beschreibt das hinreichend gut. Etwas runter scrollen. Du musst dann halt das Java-Objekt, das den Root-Node des Sepa-XMLs beschreibt, vewenden.

Hier das Zip-File, mit allen Daten. Wenn es nicht klappt, schicke ich nur das Ant-Build-File, weil es wirklich trivial ist (hat mich jetzt mit dem Schreiben des Textes 10min gekostet).

Anhang anzeigen sepa_orm_schema.zip

*#edit:*
Was noch zu tun wäre: Im Ant-File müssen die Properties ganz oben noch angepasst werden...


----------

