2012-01-25 23 views
17

Per impostazione predefinita,È possibile forzare XmlWriter a emettere <my-tag></my-tag> anziché <my-tag/>?

someXmlWriter.WriteElementString("my-tag", someString); 

produce <my-tag />

mi sono guardato intorno XmlWriterSettings classe per le possibili opzioni che forzino il produttore di produrre <my-tag></my-tag> invece, ma non ha trovato nulla.

Esiste un modo semplice per forzare lo XmlWriter all'emissione di elementi vuoti con "tag aperto, tag di chiusura" anziché con il modulo a mano corta?

Modifica:
Sì! Mi rendo conto che per quanto riguarda la validità dell'XML le due notazioni sono equivalenti, valide e tutte ... Sto comunque lavorando con il codice legacy che analizza tale XML usando Read(), cioè a livello di nodo (!) E armeggia di cose da Leggi() -ing quando su un nodo vuoto ...

Quindi la mia domanda viene nel contesto di limitare la quantità di modifiche a questo codice legacy. La domanda è infatti sovrapposta a this SO question come suggerito; nessuna delle opzioni offerte è comunque facilmente applicabile alla mia situazione.

+0

Perché? Sono equivalenti. – Quentin

+1

possibile duplicato di [C#: XmlTextWriter.WriteElementString non riesce su stringhe vuote?] (Http://stackoverflow.com/questions/1176202/c-xmltextwriter-writeelementstring-fails-on-empty-strings) – nemesv

+0

Puoi trovare una soluzione qui : http://stackoverflow.com/questions/13389960/how-to-use-xmlwritersettings-when-using-override-void-writeendelement opere di per me. – Portekoi

risposta

-11

Non ci sono impostazioni per farlo in .Net. Sono la stessa cosa e qualsiasi parser dovrebbe essere in grado di gestire un XML valido.

+0

't è sempre più facile dimostrare che qualcosa esiste piuttosto che qualcosa non lo fa ;-). Sei "abbastanza sicuro" che non esistono approcci opzionali per forzare XmlWriter a produrre l'una o l'altra forma dell'elemento vuoto? (vale a dire in modo globale rispetto al trucco con WriteStart/WriteEndElement). Conoscete la SM o altre fonti autorevoli che confermerebbero questo? – mjv

+1

@mjv Sì. http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.xmlwritersettings.aspx Ho effettuato ricerche approfondite proprio la settimana scorsa perché alcuni middleware di cui ci occupavamo stavano soffocando su un tag a chiusura automatica durante una traduzione. L'unica soluzione è una soluzione alternativa per scrivere il proprio metodo per farlo come è stato sottolineato. http://blogs.msdn.com/b/ericwhite/archive/2009/07/08/empty-elements-and-self-closing-tags.aspx –

+0

-1 perché NON sono la stessa cosa in xhtml (che è xml). I tag script, in particolare, non sono validi se sono auto-chiusi, quindi a volte è necessario impedire i tag a chiusura automatica, anche se non c'è il testo interno. –

1

Hai provato qualcosa di simile:

if (someString.Length > 0) 
{ 
    someXmlWriter.WriteElementString("my-tag", someString); 
} 
else 
{ 
    someXmlWriter.WriteStartElement("my-tag"); 
    someXmlWriter.WriteEndElement("my-tag"); 
} 

magari fare una classe di utilità con che, come una funzione membro.

+0

Non ho provato, ma ho il sospetto che funzionerebbe. Ahimè sto lavorando con il codice legacy e stavo andando per l'approccio "minimi cambiamenti" ... – mjv

+0

una classe di utilità o derivare una classe XmlWriter che fa quanto sopra. Entrambi saranno probabilmente un numero elevato di modifiche, ma entrambi potrebbero anche essere l'approccio "minimi cambiamenti". – DwB

+0

In effetti questa soluzione è suggerita anche nella domanda "duplicata" di cui sopra, insieme all'idea di rendere questo un metodo di estensione. Se tutto fallisce, potrei farlo, o riscrivere il parser in modo che funzioni a livello _element_. Comunque, grazie per il suggerimento – mjv

17

questo ha funzionato per me:

writer.WriteStartElement("my-tag"); 
writer.WriteRaw(someString); 
writer.WriteFullEndElement(); 

WriteEndElement ancora auto chiuso il tag

+1

nei miei test, se faccio writer.WriteRaw (""), e quindi writer.WriteEndElement(), i miei tag non erano auto-chiusi. VS 2010. –

0

Ho appena incontrato questo esattamente lo stesso problema, e mentre sembra una specie di hack, questo ha davvero funzionato e era molto intrusivo con il codice esistente con cui dovevo lavorare.

private static XElement MakeElementLongHand(this XElement rootElem) 
{ 
    rootElem.Value = " "; 
    rootElem.Value = string.Empty; 
    return rootElem; 
} 
3

Se si ottiene il messaggio Extension method can only be declared in non-generic, non-nested static class come la parola this può essere evidenziato, è sufficiente creare una classe di estensione come indicato di seguito:

public static class Extension 
{ 
    public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value) 
    { 
     writer.WriteStartElement(localName); 
     writer.WriteRaw(value); 
     writer.WriteFullEndElement(); 
    } 
} 

Spero che questo si rivela utile :-)

1

Lasciando questo qui nel caso qualcuno ne abbia bisogno; poiché nessuna delle risposte di cui sopra ha risolto per me, o sembrava eccessivo.

FileStream fs = new FileStream("file.xml", FileMode.Create); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    XmlWriter w = XmlWriter.Create(fs, settings); 
    w.WriteStartDocument(); 
    w.WriteStartElement("tag1"); 

     w.WriteStartElement("tag2"); 
     w.WriteAttributeString("attr1", "val1"); 
     w.WriteAttributeString("attr2", "val2"); 
     w.WriteFullEndElement(); 

    w.WriteEndElement(); 
    w.WriteEndDocument(); 
    w.Flush(); 
    fs.Close(); 

Il trucco era quello di impostare la XmlWriterSettings.Indent = true e aggiungerlo alla XmlWriter.

Edit:

In alternativa è anche possibile utilizzare

w.Formatting = Formatting.Indented; 

invece di aggiungere un XmlWriterSettings.

2

Prova questo:

x.WriteStartElement("my-tag"); 

//Value of your tag is null 

If (<"my-tag"> == "") 

{ 
    x.WriteWhitespace(""); 
}else 
    x.WriteString(my-tag); 

x.WriteEndElement(); 
0

Io uso il codice successivo:

if (string.IsNullOrEmpty(myStringValue)) 
{ 
    myWriter.WriteStartElement("mytag"); 
    myWriter.WriteFullEndElement(); 
} 
else 
{ 
    myWriter.WriteElementString("mytag", myStringValue); 
} 
Problemi correlati