Laden...

XML: XElement und XNamespace

Erstellt von Mary81 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.690 Views
M
Mary81 Themenstarter:in
87 Beiträge seit 2008
vor 10 Jahren
XML: XElement und XNamespace

Hallo zusammen,

bin schon seit Tagen dabei das Problem mit dem XNamespace zu lösen, aber irgendwie bringt mich das Internet auch nicht mehr weiter.

Ich versuche eine XML-Datei zu erstellen mit folgender Struktur:


<?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">
  <CstmrDrctDbtInitn>
    .......

Der Code:


XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
            XNamespace defaultNamespace = XNamespace.Get("urn:iso:std:iso:20022:tech:xsd:pain.008.002.02");

            XElement root = new XElement(defaultNamespace + "Document",
                new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
                new XAttribute(xsi + "schemaLocation", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"));

            XElement root2 = new XElement("CstmrDrctDbtInitn",
                                          new XElement("GrpHdr",
                                                       new XElement("MsgId", "MES001-20130830134810")
                                              ));

            root.Add(root2);
            root.Save(pfad);

Soweit so gut. Aber ich bekommen bei den zweiten Element immer folgendes raus:


  <CstmrDrctDbtInitn xmlns="">

Ich hoffe jemand kann mir sagen was ich falsch mache.

Danke

M
Mary81 Themenstarter:in
87 Beiträge seit 2008
vor 10 Jahren

Hallo,

ich hab's gelöst:


            XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
            XNamespace none = "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02";

            XElement root = new XElement(none + "Document",
                                         new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
                                         new XAttribute(xsi + "schemaLocation", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"));

Schöne Grüße

656 Beiträge seit 2008
vor 10 Jahren

Soetwas wie einen Default-Namespace (den du hier möchtest) kann XLinq nicht (zumindest nicht so).
Weil das Element CstmrDrctDbtInitn auch zum Namespace urn:iso:std... gehört, musst du auch in jedem Fall den Namespace dazuschreiben:

XNamespace pain = "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02";
var root = new XElement(pain + "Document", [...],
    new XElement(pain + "CstmrDrctDbtInitn", [...]));
M
Mary81 Themenstarter:in
87 Beiträge seit 2008
vor 10 Jahren

So hab ich es jetzt gelöst:


XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
XNamespace none = "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02";

XElement root = new XElement(none + "Document",
                                         new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
                                         new XAttribute(xsi + "schemaLocation", "urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd"));
            
XElement root2 = new XElement(none + "CstmrDrctDbtInitn",
                                          new XElement("GrpHdr", [....]));

Hinweis von gfoidl vor 10 Jahren

C#-Code bitte mit [[nop][/nop]csharp]-Tags eingeben.

174 Beiträge seit 2009
vor 10 Jahren

Hallo Mary81,

hat es eigentlich iregndwelche Probleme mit den so erstellen SEPA_XML-Dateien gegeben ???

Hntergrund:
lt. Anlage 3 der Schnittstellenspezifikation für die Datenfernübertragung zwischen Kunde und Kreditinstitut gemäß DFÜ-Abkommen „Spezifikation der Datenformate“
Version 2.7 vom 25.3.2013

ist es

<?xml version="1.0" encoding="UTF-8"?> 
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03 pain.001.003.03.xsd"> <CstmrCdtTrfInitn>

und auch ich schaffe "nur" den Namespace hinten:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<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">

Ich habe zwar nichts gefunden, was die Reihenfolge im Root-Element zwischen Namespace und Attribute regelt, aber man kann ja nie wissen.

MfG ChrisProg