XmlSerializer: Entfernen Sie unnötige xsi und xsd Namespaces
Gibt es eine Möglichkeit, konfigurieren Sie die XmlSerializer-so, dass es gar nicht schreiben, Standard-namespaces im root-element?
Was ich bekomme ist diese:
<?xml ...>
<rootelement xmlns:xsi="..." xmlns:xsd="...">
</rootelement>
und ich möchten, entfernen Sie die beiden xmlns-Deklarationen.
Duplizieren von: Serialisieren eines Objekts in XML, ohne sich xmlns="..."?
InformationsquelleAutor der Frage Dave Van den Eynde | 2009-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Dave gebeten für mich zu wiederholen, meine Antwort zu Das weglassen aller xsi und xsd, namespaces beim serialisieren eines Objekts in .NET habe ich aktualisiert diesen Beitrag und wiederholte meine Antwort hier aus dem zuvor genannten link. Das Beispiel in dieser Antwort ist die gleiche Beispiel verwendet, für die andere Frage. Was folgt, ist kopiert, wortwörtlich.
Nach dem Lesen der Dokumentation von Microsoft und mehrere Lösungen online, ich habe entdeckt, das die Lösung für dieses problem. Es funktioniert sowohl mit dem eingebauten
XmlSerializer
- und benutzerdefinierte XML-Serialisierung überIXmlSerialiazble
.Zu whit, ich verwende das gleiche
MyTypeWithNamespaces
XML-Beispiel, wurde verwendet in den Antworten zu dieser Frage so weit.Dass alle zu dieser Klasse. Nun werden einige einwenden, dass ein
XmlSerializerNamespaces
Objekt irgendwo innerhalb Ihrer Klassen; aber wie Sie sehen können, habe ich Sie ordentlich, steckte es Weg in der default-Konstruktor ausgesetzt und eine öffentliche Eigenschaft zur Rückgabe des namespaces.Nun, wenn es Zeit zum serialisieren der Klasse, würden Sie den folgenden code verwenden:
Sobald Sie dies getan haben, sollten Sie die folgende Ausgabe erhalten:
Ich habe erfolgreich mit dieser Methode in einem aktuellen Projekt mit einer tiefen Hierarchie von Klassen, die serialisiert in XML für web-service-Aufrufe. Microsoft ' s Dokumentation ist nicht sehr klar darüber, was zu tun, mit der öffentlich zugängliche
XmlSerializerNamespaces
Mitglied, sobald Sie erstellt haben, und so viele denken, es ist nutzlos. Aber nach Ihrer Dokumentation und in der Art und Weise, die oben gezeigt, können Sie anpassen, wie die XmlSerializer-generiert XML für Ihre Klassen, ohne Rückgriff auf nicht unterstützte Verhalten oder "Ihre eigenen Rollen" Serialisierung durch die ImplementierungIXmlSerializable
.Es ist meine Hoffnung, dass diese Antwort wird zur Ruhe setzen, ein für alle mal, wie, um loszuwerden, der standard -
xsi
undxsd
namespaces erzeugt durch dieXmlSerializer
.UPDATE: ich möchte nur sicherstellen, antwortete ich, die OP ' s Frage über die Beseitigung aller namespaces. Mein code oben funktioniert für diese, lassen Sie mich Ihnen zeigen, wie. Nun, im obigen Beispiel, kann man wirklich nicht loszuwerden, alle namespaces (da gibt es zwei namespaces im Einsatz). Irgendwo in Ihrem XML-Dokument, das Sie gehen zu müssen, um so etwas wie
xmlns="urn:Abracadabra" xmlns:w="urn:Whoohoo
. Wenn die Klasse in dem Beispiel ist Teil eines größeren Dokuments ist, dann irgendwo über ein namespace muss deklariert werden, für die eine der beiden (oder beide)Abracadbra
undWhoohoo
. Wenn nicht, dann wird das element in eine oder beide der namespaces müssen geschmückt werden, mit einem Präfix von einer Art (man kann nicht zwei default-namespaces, richtig?). So, für dieses BeispielAbracadabra
ist der Standard-namespace. Ich konnte in meinemMyTypeWithNamespaces
Klasse fügen Sie ein namespace-Präfix für dieWhoohoo
namespace etwa so:Nun, in meiner Klasse definition habe ich darauf hingewiesen, dass die
<Label/>
element im Namensraum"urn:Whoohoo"
, so dass ich don ' T müssen nichts weiter tun. Wenn ich jetzt serialisieren, wird die Klasse mit meinem oben Serialisierung-code unverändert, dies ist die Ausgabe:Weil
<Label>
in einem anderen namespace aus dem rest des Dokuments, es muss irgendwie etwas sein, "verziert" mit einem namespace. Beachten Sie, dass es noch keinexsi
undxsd
namespaces.Damit endet meine Antwort auf die andere Frage. Aber ich wollte sicher gehen, dass ich Sie beantwortet die OP ' s Frage über die Verwendung keine namespaces, wie ich mich fühle, ich nicht wirklich-Adresse es noch nicht. Davon ausgehen, dass
<Label>
ist Teil der gleichen namespace wie der rest des Dokuments, in diesem Fallurn:Abracadabra
:Konstruktor Aussehen würde, als würde es in meinem ersten code-Beispiel, zusammen mit der öffentlichkeit-Eigenschaft zum abrufen des Standard-namespace:
Dann, später, in Ihrem code verwendet, der
MyTypeWithNamespaces
Objekt zu serialisieren, Sie es nennen würde, wie ich oben:Und die
XmlSerializer
Spucke wieder aus der gleichen XML, wie gezeigt, unmittelbar über ohne zusätzliche namespaces in der Ausgabe:InformationsquelleAutor der Antwort fourpastmidnight
InformationsquelleAutor der Antwort Jeremy
Gibt es eine alternative - Sie können ein Mitglied des Typs XmlSerializerNamespaces in der Art serialisiert werden. Dekorieren Sie es mit der XmlNamespaceDeclarations Attribut. Fügen Sie den namespace-Präfixe und URIs zu, dass die. Dann, jeder Serialisierung, die nicht explizit eine XmlSerializerNamespaces wird, verwenden Sie das namespace-Präfix+URI-Paaren haben Sie in Ihrem Typ.
Beispiel-code, vermute, das ist Ihre Art:
Können Sie dies tun:
, Und das wird bedeuten, dass jeder Serialisierung der Instanz, die nicht angeben, seinen eigenen Satz von Präfix+URI-Paaren verwendet die "p" - Präfix für den "urn:MeineFirma.2009-namespace". Es wird auch auslassen, xsi und xsd-namespaces.
Der Unterschied hier ist, dass Sie hinzufügen die XmlSerializerNamespaces der Typ selbst, als vielmehr beschäftigt Sie sich explizit auf einen Aufruf von XmlSerializer.Serialize(). Dies bedeutet, dass, wenn eine Instanz des Typs serialisiert, indem Sie code, den Sie nicht besitzen (zum Beispiel in einer webservices-stack), und dass der code nicht explizit eine XmlSerializerNamespaces, dass serializer verwendet die namespaces in der Instanz.
InformationsquelleAutor der Antwort Cheeso