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
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.
Hallo BhaaL,
deine Info hat mich auf den richtigen Weg gebracht.
Es fehlten die Namespaces im XmlSerializer.
Danke !!!
Gruß Calmar
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.
Du kannst beim Serialize
ein XmlSerializerNamespaces-Objekt mit angeben, sofern die zu serialisierenden Daten auch dazu passende Namespace
-Attribute haben (s. Beispiel im Link).
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)]
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 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
Tipps:
Path.Combine()
statt String-Puzzleien.- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code