Sto lavorando con un'applicazione legacy che non importa elementi xml vuoti abbreviati. Ad esempio:Come utilizzare XmlWriterSettings() quando si utilizza l'override void WriteEndElement()?
BAD vuoto:
<foo />
BUONA vuoto:
<foo></foo>
So che la soluzione per ottenere questo, che presenterò ora:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc)
{
}
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc)
{
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
e la codice cliente:
var x_settings = new XmlWriterSettings();
x_settings.NewLineChars = Environment.NewLine;
x_settings.NewLineOnAttributes = true;
x_settings.NewLineHandling = NewLineHandling.Replace;
x_settings.CloseOutput = true;
x_settings.Indent = true;
x_settings.NewLineOnAttributes = true;
//var memOut = new MemoryStream();
var writer = new XmlTextWriterFull(outputFilename, Encoding.UTF8); //Or the encoding of your choice
var x_serial = new XmlSerializer(typeof(YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
Tuttavia, se si osservano attentamente, i codici XmlWriterSettings
non vengono mai utilizzati nel codice client. Pertanto l'output xml è terribilmente formattato. Le mie domande sono queste: come posso adattare il codice sopra per accettare XmlWriterSettings
?
L'utilizzo di metodi di creazione di fabbrica e classi sigillate/interne/astratte rende difficile l'implementazione di un override.
Accetterò una soluzione alternativa, non sono sposato con la mia soluzione di cui sopra.
- SOLUZIONE SOLUZIONE
Fase 1: creare la seguente classe nella soluzione:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter sink) : base(sink)
{
Formatting = Formatting.Indented;
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
Fase 2: Aggiungere il seguente codice client. Assicurarsi di sostituire YOUR_OBJECT_TYPE e YOUR_OBJECT_INSTANCE con la classe e l'istanza si sta lavorando con:
TextWriter streamWriter = new StreamWriter(outputFilename);
var writer = new XmlTextWriterFull(streamWriter);
var x_serial = new XmlSerializer(typeof (YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
la soluzione precedente produrrà il seguente elemento vuoto xml formattazione:
<foo>
</foo>
Il problema con questa soluzione è che aggiunge un avanzamento riga (nota che gli elementi sono su righe separate). Questo potrebbe essere accettabile per te ma causa problemi con la mia applicazione legacy.
Non so se affronta questo caso particolare , ma è possibile utilizzare il sovraccarico XmlWriter.Create che accetta uno scrittore esistente e le impostazioni. È possibile passare l'implementazione del proprio autore a quel metodo. Secondo http://msdn.microsoft.com/en-us/library/a09119h4.aspx, consente di "aggiungere funzionalità aggiuntive a un oggetto XmlWriter sottostante", ma non so se questo include la formattazione. – fsimonazzi
Non sono stato in grado di rispondere alla mia stessa domanda. Ma ho trovato una soluzione accettabile. Lo posterò qui per aiutare eventualmente qualcun altro; tuttavia, voglio ancora una soluzione alla mia domanda. La mia soluzione alternativa non utilizza XmlWriterSettings che è ciò che voglio. Aggiornamento – sapbucket
: la mia applicazione legacy non accetta la soluzione precedente perché il tag completo ha inserito un elemento di avanzamento riga; quindi i tag appaiono su linee separate. Sto pubblicando una taglia per vedere se posso attirare più attenzione alla domanda. –
sapbucket