13

Sto usando DatacontractSerializer per serializzare il mio dominioModello in un file xml. Sto ricevendo l'output come di seguito.Rimuovere il prefisso dello spazio dei nomi "d1p1" nell'output XML DataContractSerializer

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <d1p1:Name z:Id="2">Ankit</d1p1:Name> 
    <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1"> 
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
     <d2p1:Key z:Id="4">key1</d2p1:Key> 
     <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5"> 
     <d4p1:points z:Id="6" z:Size="2"> 
      <d2p1:double>45.5</d2p1:double> 
      <d2p1:double>546.45</d2p1:double> 
     </d4p1:points> 
     </d2p1:Value> 
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
    </d1p1:PointsDictionary> 
</z:anyType> 

e voglio sbarazzarsi di questi "d1p1" prefissi di namespace e vogliono solo </PointDictionary> come tag, invece di </d1p1:PointsDictionary>. Ho provato a inserire l'attributo DataMember nelle proprietà della mia classe, ma non risolve gran parte del problema. Come il file XML di output può essere modificato dall'utente finale, quindi voglio un file XML dall'aspetto più pulito rispetto a quello precedente.

Prima priorità è controllare solo tramite codice e se non è possibile, passare a XSLT oa qualsiasi altro schema.

+0

Benvenuti in StackOverflow: se inserisci codice, XML o campioni di dati, ** per favore ** evidenzia queste righe nell'editor di testo e fai clic sul pulsante "esempi di codice" ('{}') sulla barra degli strumenti dell'editor per il formato e la sintassi lo evidenziano! –

risposta

3

Sembra che DataContractSerializer non dia molto controllo sui prefissi. La risposta a XML Serialization and namespace prefixes suggerisce di utilizzare XmlSerializer se si desidera controllare il prefisso dello spazio dei nomi.

La domanda non è chiara se si desidera rimuovere completamente i prefissi dello spazio dei nomi per il modello di dominio. Il tuo esempio sopra ha diversi prefissi per i namespace: d1p1, d2p1, d4p1. Changing namespace for XML file in XSL Translation fornisce alcune indicazioni sulla ridenominazione del prefisso tramite XSLT.

+5

XmlSerializer presenta due limitazioni rispetto a DataContractSerializer: non gestirà le interfacce e impone a ogni classe di avere un costruttore senza parametri. Credo che sia una soluzione a lungo termine migliore per utilizzare DataContractSerializer e trovare qualche altro metodo per gestire il problema dello spazio dei nomi. – Contango

+0

@Contango, sono d'accordo in linea di principio ... eccetto che 'DataContractSerializer' * fa * (nella mia esperienza) richiede un costruttore senza parametri. Ottengo un errore di runtime se provo a istanziarlo su un tipo che non ne ha uno. – harpo

+0

@harpo DataContractSerializer sicuramente non richiede un costruttore vuoto. Stai facendo qualcosa in modo errato. Se desideri pubblicare il tuo codice in una nuova domanda, saremo lieti di esaminarlo. – Dan

5

L'utilizzo di uno spazio dei nomi vuoto sembra rimuovere il prefisso. Imposta la classe con il seguente attributo DataContract:

[DataContract(Namespace="")] 
public class MyClass 
{ ... } 

quindi assicuratevi di impostare lo spazio dei nomi di una stringa vuota quando (de) serializzazione:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, ""); 
0

si dovrebbe essere in grado di sbarazzarsi di quei prefissi semplicemente assicurandoti che le classi che stai tentando di serializzare in XML si trovino nello stesso spazio dei nomi. Ad esempio ho avuto due classi ApplicationListResponse e Application. In precedenza, gli spazi dei nomi erano Models.Responses and Models.Responses.Application. Ho cambiato entrambi i Namespace in "Modelli" e questo ha eliminato il prefisso nell'output XML.

Problemi correlati