C# XML-Hilfe
-
Mittwoch, 20. Februar 2013 14:15
Liebe Forumsmitglieder,
vor zwei Jahren wurde mir hier im Forum schon einmal geholfen. Nun habe ich wieder eine
Problem. Ich versuche in „XML“ einige Daten zu schreiben. Leider ist mein Ergebnis nicht das
was es sein sollte. Ich habe den C#-Code nachfolgend aufgeführt.
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.Xml.XPath;
und andere
privatevoidbtnTesten01_Click(objectsender, EventArgse)
{
XmlWriterSettingsmySettings = newXmlWriterSettings()
{
Indent = true,
IndentChars = "",
NewLineChars = "\r\n"
};
XmlWriterxw = XmlWriter.Create(@"aaa_xml_TEST.xml", mySettings);
xw.WriteStartDocument();
xw.WriteStartElement("Document");
xw.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
xw.WriteAttributeString("xsi", "schemaLocation", null, "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd");
xw.WriteElementString("xsi", null, "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02");
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Flush();
xw.Close();
}
Das Ergebnis aus meinem Code:
<?xml version="1.0" encoding="UTF-8"?>
- <Document xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsi>urn:iso:std:iso:20022:tech:xsd:pain.008.002.02</xsi>
Das sollte das Ergebnis sein:
<?xml version="1.0" encoding="UTF -8"?>
-<Document xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02">
Was mache ich falsch ? Ich habe den Code schon in allen Richtungen umgestellt – ich komme einfach nicht darrauf.
Ich wäre sehr dankbar, wenn mir jemand aus dem Forum auf die Sprünge hilft.
Im Voraus schon besten Dank.
Alle Antworten
-
Mittwoch, 20. Februar 2013 15:00
Hi,
ohne das jetzt ausprobiert zu haben:
WriteElementString schreibt <Element>Inhalt</Element>. Wenn Du ein Attribut in einem Node hinzufügen willst, ist WriteAttributeString das richtige. In deinem Fall dann wohl:
xw.WriteAttributeString( "xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02" );
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzMVP Mittwoch, 20. Februar 2013 15:02
-
Mittwoch, 20. Februar 2013 15:33Beantworter
Hallo,
die bei Dir fehlerhafte Angabe gibt den Xml-Namespace des Document-Knoten an,
und müsste bei WriteStartElement angegeben werden:const string DateiName = @"C:\TEMP\XmlTest.xml"; var settings = new XmlWriterSettings() { Indent = true }; using (var writer = XmlWriter.Create(DateiName, settings)) { writer.WriteStartDocument(); writer.WriteStartElement("Document", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02"); writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); writer.WriteAttributeString("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"); writer.WriteEndElement(); writer.WriteEndDocument(); }liefert
<?xml version="1.0" encoding="utf-8"?> <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02" />
Weiteres siehe Behandlung von Namespaces im "XmlWriter"
Gruß Elmar
- Bearbeitet Elmar BoyeMVP, Editor Mittwoch, 20. Februar 2013 15:36 Link
-
Donnerstag, 21. Februar 2013 13:33
Hallo Stefan,
Vielen Dank für Deine schnelle Antwort. Leider hilft mir der Hinweis nicht weiter,
denn er löst bei mir einen Fehler aus, und zwar ein System.Xml.XmlException.
Leider komme ich nicht weiter - trotzdem Nochmals vielen Dank.
Gruß
Georg
-
Donnerstag, 21. Februar 2013 13:44
Hallo Elmar,
Vielen Dank für Deinen Code. Leider liefert er mir nicht das gewünschte Ergebnis.
Ich habe versucht, den Code zu modifizieren, leider ohne Erfolg. Ich tu mir sehr schwer mit XML.
Ich habe nachfolgend beide Ergebnisse aufgeführt.
Vielleicht kannst Du bitte nochmals draufschauen.
1. Das Ergebnis mit dem vorgeschlagenen Code - Anzeige mit Internet-Explorer:
<?xml version="1.0" encoding="UTF -8"?>
<Document xmlns="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" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
2. Dein Ergebnis in der Box “liefert“:
<?xml version="1.0" encoding="UTF -8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02
pain.008.002.02.xsd" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02" />
3. Das sollte aber das Ergebnis sein:
<?xml version="1.0" encoding="UTF -8"?>
-<Document xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02">
Nochmals vielen Dank
Georg
-
Donnerstag, 21. Februar 2013 16:26Beantworter
Hallo Georg,
das Fragment wäre so wie es oben wart, nicht wirklich zu gebrauchen,
da fehlt einfach der Inhalt.zu 3. Das wäre kein gültiges Xml Dokument.
Denn Xml fordert genau einen Wurzelknoten - was hier Document wäre.
Und der muss ein Ende haben, entweder durch />, wenn es ein leerer Knoten ist -
was der XmlWriter automatisch macht und deswegen gabe es bei mir das Ergebnis.
Nur folgen dort in der Praxis weitere Kind-Knoten, und dann sähe es (gekürzt) so aus:<Document> <Kind><!-- weitere Knoten--></Kind> </Document>
Konkreter in Code:
const string DateiName = @"C:\TEMP\XmlTest.xml"; var settings = new XmlWriterSettings() { Indent = true }; using (var writer = XmlWriter.Create(DateiName, settings)) { writer.WriteStartDocument(); writer.WriteStartElement("Document", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02"); writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); writer.WriteAttributeString("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"); writer.WriteStartElement("CstmrCdtTrfInitn"); writer.WriteStartElement("GrpHdr"); writer.WriteEndElement(); // GrpHdr writer.WriteStartElement("PmtInf"); writer.WriteEndElement(); // PmtInf writer.WriteEndElement(); // CstmrCdtTrfInitn writer.WriteEndElement(); // Document writer.WriteEndDocument(); }liefert dann:
<?xml version="1.0" encoding="utf-8"?> <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"
xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02"> <CstmrCdtTrfInitn> <GrpHdr /> <PmtInf /> </CstmrCdtTrfInitn> </Document>auch hier gibt es leere Elemente für GrpHdr, PmtInf, die in der Praxis aber Inhalte haben werden (müssen, lt SEPA),
am Ende etwas wie https://gist.github.com/pelle/1191915
(Achtung immer aufpassen, welche Version, da kreuchen diverse "Standards" durch die Sparkassenwelt ;)Was Namespace-Angaben angeht:
xmlns="..." gibt den Standardnamensraum an.
Man definiert einen Namensraum bevor man ihn verwendet, hier für XML Schema (üblicherweise mit xsi abgekürzt).Für mehr lies bitte den bereits oben gegeben Wikipedia-Link.
Gruß Elmar
-
Donnerstag, 21. Februar 2013 19:52
Hallo Elmar,
vielen Dank für Deine informative Antwort. Du hast erkannt, dass es mir um SEPA geht. Ich habe
ein Vereinsprogramm geschrieben in vb.net. Da habe ich u.a. die Beiträge im Lastschriftverfahren
im alten Format Dtaus etc. eingezogen. Nun habe ich mein Vereinsprogramm in C# teilweise um-
geschrieben, was auch funktioniert. Ich bin nur Hobby-Prog. Ich glaube Deine Hinweise verstanden
zu haben; brauche aber noch einige Zeit um Deine Hinweise umzusetzen (ich bin schon etwas Älter).
Nochmals herzlichen Dank für Deinen umfangreichen "Gehirnschmalz"!!!
Herzlichen Gruß
Georg

