Entfernen von Namespaces Bei der XML-Serialisierung
Angesichts dieses generischen Serialisierung-code:
public virtual string Serialize(System.Text.Encoding encoding)
{
System.IO.StreamReader streamReader = null;
System.IO.MemoryStream memoryStream = null;
memoryStream = new System.IO.MemoryStream();
System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings();
xmlWriterSettings.Encoding = encoding;
System.Xml.XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings);
Serializer.Serialize(xmlWriter, this);
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
streamReader = new System.IO.StreamReader(memoryStream);
return streamReader.ReadToEnd();
}
und das Objekt (gen würde von xsd2code):
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "Com.Foo.Request")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "Com.Foo.Request", IsNullable = false)]
public partial class REQUEST_GROUP
{
[EditorBrowsable(EditorBrowsableState.Never)]
private List<REQUESTING_PARTY> rEQUESTING_PARTYField;
[EditorBrowsable(EditorBrowsableState.Never)]
private RECEIVING_PARTY rECEIVING_PARTYField;
[EditorBrowsable(EditorBrowsableState.Never)]
private SUBMITTING_PARTY sUBMITTING_PARTYField;
[EditorBrowsable(EditorBrowsableState.Never)]
private REQUEST rEQUESTField;
[EditorBrowsable(EditorBrowsableState.Never)]
private string iDField;
public REQUEST_GROUP()
{
this.rEQUESTField = new REQUEST();
this.sUBMITTING_PARTYField = new SUBMITTING_PARTY();
this.rECEIVING_PARTYField = new RECEIVING_PARTY();
this.rEQUESTING_PARTYField = new List<REQUESTING_PARTY>();
this.IDField = "2.1";
}
}
Ausgang aus der Serialisierung, die mit einem codieren von utf-8:
<?xml version="1.0" encoding="utf-8"?>
<REQUEST_GROUP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="2.1" xmlns="Com.Foo.Request">
<RECEIVING_PARTY />
<SUBMITTING_PARTY />
<REQUEST LoginAccountIdentifier="xxx" LoginAccountPassword="yyy" _RecordIdentifier="" _JobIdentifier="">
<REQUESTDATA>
<PROPERTY_INFORMATION_REQUEST _SpecialInstructionsDescription="" _ActionType="Submit">
<_DATA_PRODUCT _ShortSubjectReport="Y" />
<_PROPERTY_CRITERIA _City="Sunshine City" _StreetAddress2="" _StreetAddress="123 Main Street" _State="CA" _PostalCode="12345">
<PARSED_STREET_ADDRESS />
</_PROPERTY_CRITERIA>
<_SEARCH_CRITERIA />
<_RESPONSE_CRITERIA />
</PROPERTY_INFORMATION_REQUEST>
</REQUESTDATA>
</REQUEST>
</REQUEST_GROUP>
BEARBEITEN
Frage 1: Wie kann ich dekorieren Sie die Klasse in so eine Mode, oder manipulieren der serializer, um loszuwerden, alle die namespaces in der REQUEST_GROUP Knoten während der Verarbeitung, NICHT post-Verarbeitung mit xslt-oder regex.
Frage 2: - Bonus-Punkt, wenn man könnte hinzufügen, das doc zu geben.
Danke.
InformationsquelleAutor Stephen Patten | 2011-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur wollen, um den namespace zu entfernen Aliase, da, wie schon gezeigt, die Sie verwenden können
XmlSerializerNamespaces
zu zwingenXmlSerializer
zu verwenden den namespace explizit (d.h.xmlns="blah"
) auf jedes element, anstatt zu erklären, eine alias und die Verwendung des alias, statt.Jedoch unabhängig davon, was Sie tun, mit den Aliasnamen, die grundlegenden name des Elements
REQUEST_GROUP
in derCom.Foo.Request
namespace. Sie können nicht entfernen Sie den namespace komplett ohne, dass die Repräsentation eine wichtige änderung der zugrunde liegenden Daten, d.h. jemand, irgendwo wird eine Ausnahme (aufgrund der immer Daten, die es nicht erwarten - speziellREQUEST_GROUP
im root-namespace). In C# - Bedingungen, es ist der Unterschied zwischenSystem.String
undMy.Custom.String
- sicher, Sie sind beide genanntString
, aber das ist nur Ihre lokalen Namen.Wenn Sie wollen entfernen Sie alle Spuren von dem namespace, dann eine pragmatische Möglichkeit wäre, zu Bearbeiten, entfernt der
Namespace=...
Einträge aus[XmlRoot(...)]
und[XmlType(...)]
(plus irgendwo anders, nicht im Beispiel dargestellt).Wenn die Arten sind außerhalb Ihrer Kontrolle, Sie können auch zur Laufzeit mithilfe von
XmlAttributeOverrides
- aber eine Warnung: wenn Sie erstellen einXmlSerializer
mitXmlAttributeOverrides
Sie muss cache und wieder verwenden - sonst wird IhreAppDomain
Auslaufen (er erzeugt Baugruppen on-the-fly pro serializer in diesem Modus und Baugruppen nicht entladen werden).InformationsquelleAutor Marc Gravell
Können Sie entfernen Sie die namespaces wie diese:
Als für das einfügen des doctype, ich weiß, es ist möglich, eine benutzerdefinierte
XmlWriter
und einfach überschreibenWriteStartDocument
mit einer Methode, die einen Aufruf zuWriteDocType
sein, aber ich hoffe jemand kennt einen einfacheren Weg, als das.EDIT: Übrigens, ich empfehle die Verwendung
using
:Es verarbeitet automatisch Aufräumen des streams durch den Aufruf der
Dispose
Methode, wenn der block endet.Ich sehe keine Referenz auf eine
q1
- namespace in Frage.. Woher kommt das?es passiert, nachdem ich das ausführen Ihrer mit Ihrem Vorschlag..
um dies zu beheben, fügen Sie auch
ns.Add("", "Com.Foo.Request");
- dann wird der namespace ist ohne alias.XmlSerializer erfindet es als alias für "Com.Foo.Request"; per default aliases alles, was es braucht, in den Fall muss man es Ihnen mehrmals
InformationsquelleAutor Flynn1179