2010-02-26 17 views
49

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

definitiva che sto cercando di generare il seguente codice XML:

<myNamespace:Node xmlns:myNamespace="..."> 
    <childNode>something in here</childNode> 
</myNamespace:Node> 

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

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

risposta

84

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 cambiare il namespace in fase di esecuzione, è possibile inoltre utilizzare XmlAttributeOverrides.

+4

+1 ma potrei suggerire una modifica per chiarire che il primo parametro nel metodo .Add è il luogo in cui avviene la magia per l'impostazione del prefisso. Non è stato chiaro per me dalla risposta fino a quando ho controllato i documenti MSDN. –

+0

equo presumere che non ci sia un equivalente con DataContractSerializer? (Volevo solo mantenere aperte le mie opzioni) –

+0

@Slace - sì, credo che sia lecito ritenere che non ci sia ** un equivalente per DCS. In definitiva, DCS non ha lo scopo di darti un grande controllo sull'output (se vuoi controllare l'xml, usa 'XmlSerializer' - questo è il suo lavoro). –

3

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 radice ma i tag all'interno di tipi diversi avranno lo spazio dei nomi associato alla classe.

Ho avuto l'opportunità di utilizzare due classi generiche diverse ma ho spazi di nomi diversi in base al server con cui stavo parlando (non chiedere sotto il mio controllo).

Ho provato tutti gli override offerti qui e alla fine ho rinunciato e ho utilizzato 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 utilizzare tutte le sostituzioni di fantasia ma ha fatto il lavoro.

Problemi correlati