Вопрос 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
     
      Enthält Code

    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


  • Mittwoch, 20. Februar 2013 15:33
    Beantworter
     
      Enthält Code

    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


  • 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:26
    Beantworter
     
      Enthält Code

    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