Laden...

Wie kann ich ein XSD mit prefix erstellen?

Erstellt von Calmar vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.462 Views
C
Calmar Themenstarter:in
6 Beiträge seit 2019
vor 4 Jahren
Wie kann ich ein XSD mit prefix erstellen?

Hallo,

ich habe aus 4 xsd Dateien mit xsd.exe die C#-Klassen erstellt.
Soweit hat das geklappt und ich habe in meinem Projekt auf diese Klasse Zugriff.
Wenn ich nun aus meinem Projekt eine XML erstellen möchte (XmlSerializer -> Serialize) funktioniert dies auch, aber es fehlen die Prefix im neuen XML.

gewünscht ist: <rsm:ExchangedDocumentContext>
in meiner xml: <ExchangedDocumentContext>

Also das rsm: fehlt ?

Was mache ich falsch ?
Muss ich bei der xsd.exe etwas beachten oder beim serialisieren.
Habe jetzt Tage damit verbracht und komme nicht drauf.

Viele Grüße
Calmar

656 Beiträge seit 2008
vor 4 Jahren

Nur weil das rsm: fehlt, heißt das noch lange nicht, dass deine Datei nicht kompatibel ist.
In XML gibt es das Konzept eines Namespaces, der entweder per (frei definierbarem und sogesehen auch irrelevanten) Präfix referenziert (was dein rsm: wäre; mit entsprechender Deklaration per xmlns:rsm="your namespace here" Anweisung) oder als Default-Namespace pauschal überall gültig sein kann (was zb. nur ein einfaches xmlns="your namespace here" wäre).

Sofern das xmlns="your namespace here" irgendwo (üblicherweise: am Root Element; oder zumindest dort wo das Schema wechselt) steht, ist das XML selbst semantisch identisch (aber nicht syntaktisch).
Falls dir ersteres reicht (was zu 99% der Fall sein sollte), hast du nichts weiter zu tun. Falls nicht, musst du dich ein wenig mit dem XmlSerializer beschäftigen, ob bzw. wie du dort die Namespace-Prefixes beinflußen kannst.

C
Calmar Themenstarter:in
6 Beiträge seit 2019
vor 4 Jahren

Hallo BhaaL,

deine Info hat mich auf den richtigen Weg gebracht.

Es fehlten die Namespaces im XmlSerializer.

Danke !!!

Gruß Calmar

N
3 Beiträge seit 2020
vor 4 Jahren

Hallo Calmar,

ich habe das gleiche Problem beim erstellen einer Zugferd-XML.

Könntest du genauer erklären wie du das Problem gelöst bekommen hast?

Danke im Voraus.

Mit freundlichen Grüßen.

4.931 Beiträge seit 2008
vor 4 Jahren

Du kannst beim Serialize ein XmlSerializerNamespaces-Objekt mit angeben, sofern die zu serialisierenden Daten auch dazu passende Namespace-Attribute haben (s. Beispiel im Link).

N
3 Beiträge seit 2020
vor 4 Jahren

Wie muss ich vorgehen wenn die Serialization wie in Code Nr.2 von statten geht?

Mit folgendem Code habe ich leider keinen Erfolg:

Code 1

XmlSerializer serializer = new XmlSerializer(typeof(CrossIndustryInvoiceType));
            TextWriter writer = new StreamWriter(PfadXml);

            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("rsm", "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100");

Code 2

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100")]
[System.Xml.Serialization.XmlRootAttribute("CrossIndustryInvoice", Namespace = "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100", IsNullable = false)]
N
3 Beiträge seit 2020
vor 4 Jahren

Ok habe meinen Fehler gefunden.

16.806 Beiträge seit 2008
vor 4 Jahren

Ein Forum funktioniert dann, wenn man andere auch über die Erfolge informiert.
Wäre daher nett und im Sinne des Forums, wenn Du auch beschreibst, woran es lag 😉

C
Calmar Themenstarter:in
6 Beiträge seit 2019
vor 4 Jahren

Hallo,

hier mein Lösungsweg:

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
namespaces.Add("rsm", "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100");
namespaces.Add("ram", "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100");
namespaces.Add("udt", "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100");

XmlSerializer xml_ser = new XmlSerializer(typeof(CrossIndustryInvoiceType));
TextWriter tw = new StreamWriter(env_temp + "\\xrechnung-invoice.xml");
xml_ser.Serialize(tw, invoice, namespaces);
tw.Close();

Gruß
Calmar

16.806 Beiträge seit 2008
vor 4 Jahren

Tipps:

  • Verwende Path.Combine() statt String-Puzzleien.
  • Streams in ein using() packen um offene Handles zu vermeiden.
C
Calmar Themenstarter:in
6 Beiträge seit 2019
vor 4 Jahren

Danke für die Tips, habs umgesetzt.