Serializzazione XML e prefissi di namespace

Sto cercando un modo con C # che possa serializzare una class in XML e aggiungere uno spazio dei nomi, ma definire il prefisso che tale spazio dei nomi utilizzerà.

In definitiva sto provando a generare il seguente XML:

 something in here  

So che sia con DataContractSerializer che con XmlSerializer posso aggiungere uno spazio dei nomi, ma sembrano generare un prefisso internamente, con qualcosa che non sono in grado di controllare. Sono in grado di controllarlo con uno di questi serializzatori (posso usarli entrambi)?

Se non sono in grado di controllare la generazione degli spazi dei nomi, dovrò scrivere il mio serializzatore XML e, in caso affermativo, qual è il migliore per scriverlo?

Per controllare l’alias dello spazio dei nomi, utilizzare XmlSerializerNamespaces .

 [XmlRoot("Node", Namespace="http://flibble")] public class MyType { [XmlElement("childNode")] public string Value { get; set; } } static class Program { static void Main() { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("myNamespace", "http://flibble"); XmlSerializer xser = new XmlSerializer(typeof(MyType)); xser.Serialize(Console.Out, new MyType(), ns); } } 

Se è necessario modificare lo spazio dei nomi in fase di runtime, è inoltre ansible utilizzare XmlAttributeOverrides .

Quando si utilizza il codice generato da uno schema in cui i tipi hanno spazi dei nomi, questo override dello spazio dei nomi si applica a livello di root ma i tag all’interno di tipi diversi avranno lo spazio dei nomi associato alla class.

Ho avuto l’occasione di aver bisogno di utilizzare due classi generiche diverse ma avere spazi di nomi diversi in base al server con cui stavo parlando (non chiedere di non essere sotto il mio controllo).

Ho provato tutti gli override offerti qui e alla fine ho rinunciato e ho usato una sorta di metodo di forza bruta che in realtà ha funzionato abbastanza bene. Quello che ho fatto è stato serializzato su una stringa. Quindi utilizzare string.replace per modificare gli spazi dei nomi, quindi pubblicare lo stream dalla stringa utilizzando un stringwriter. Lo stesso nella risposta: acquisizione in una stringa: manipola lo spazio dei nomi, quindi deserializza la stringa da un writer stringa.

Potrebbe non essere elegante o usare tutte le sovrascrizioni fantasiose ma ha fatto il lavoro.