2010-03-23 14 views
16

Ich versuche, ein XML-Dokument zu generieren, das den Standardnamespace ohne ein Präfix enthält, das XmlSerializer verwendet, z.Wie füge ich einen Standard-Namespace ohne Präfix mit XMLSerializer hinzu

<?xml version="1.0" encoding="utf-8" ?> 
<MyRecord ID="9266" xmlns="http://www.website.com/MyRecord"> 
    <List> 
     <SpecificItem> 

den folgenden Code verwenden ...

string xmlizedString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(typeof(ExportMyRecord)); 
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); 
xmlnsEmpty.Add(string.Empty, string.Empty); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
xs.Serialize(xmlTextWriter, myRecord, xmlnsEmpty); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
xmlizedString = this.UTF8ByteArrayToString(memoryStream.ToArray()); 

und Klassenstruktur ...

[Serializable] 
[XmlRoot("MyRecord")] 
public class ExportMyRecord 
{ 
    [XmlAttribute("ID")] 
    public int ID { get; set; } 

Jetzt habe ich verschiedene Optionen ausprobiert ...

XmlSerializer xs = new XmlSerializer 
        (typeof(ExportMyRecord),"http://www.website.com/MyRecord"); 

oder ...

[XmlRoot(Namespace = "http://www.website.com/MyRecord", ElementName="MyRecord")] 

gibt mir ...

<?xml version="1.0" encoding="utf-8"?> 
<q1:MylRecord ID="9266" xmlns:q1="http://www.website.com/MyRecord"> 
    <q1:List> 
     <q1:SpecificItem> 

muss ich die XML den Namensraum ohne das Präfix haben, wie es zu einem Drittanbieter los ist und sie lehnen alle anderen Alternativen.

Antwort

29

Dort gehen Sie:

ExportMyRecord instance = GetInstanceToSerializeFromSomewhere(); 
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces(); 
xmlnsEmpty.Add(string.Empty, "http://www.website.com/MyRecord"); 
var serializer = new XmlSerializer(
    instance.GetType(), 
    "http://www.website.com/MyRecord" 
); 
+0

perfekte Lösung! – viperguynaz

+0

wollte nur darauf hinweisen, dass Sie nicht xmlnsEmpty verwenden und kann weggelassen werden. Die Überladung von serialize, die XmlSerializerNamespaces verwendet, scheint nicht den string.empty-Wert zu verwenden. – arviman

+0

Brilliant! hatte auch Probleme mit ' Eon