2013-04-04 6 views
7

Sto scrivendo xml con XmlWriter. Il mio codice ha un sacco di sezioni in questo modo:Come verificare il nome dell'elemento con WriteEndElement

xml.WriteStartElement("payload"); 
ThirdPartyLibrary.Serialise(results, xml); 
xml.WriteEndElement(); // </payload> 

Il problema è che il metodo ThirdPartyLibrary.Serialise è inaffidabile. Può accadere (a seconda della variabile results) che non chiuda tutti i tag che apre. Di conseguenza, la mia riga WriteEndElement è pervertita, consumata chiudendo i tag sospesi della libreria, invece di scrivere </payload>.

Pertanto, desidero effettuare una chiamata verificata a WriteEndElement che controlla il nome dell'elemento e genera un'eccezione a meno che il cursore non si trovi nell'elemento previsto.

xml.WriteEndElement("payload"); 

Si può pensare a questo come XmlReader.ReadStartElement(name) che getta a meno che il cursore si trova nel luogo previsto nel documento.

Come posso ottenere questo risultato?


Modifica: un secondo caso d'uso per questo metodo di estensione sarebbe rendere il mio codice più leggibile e affidabile.

+0

È possibile inviare un nuovo 'XmlWriter' a' ThirdPartyLibrary.Serialise' e ​​controllare che sia esplicito prima di aggiungerlo all'oggetto 'xml'? – zimdanen

+0

Puoi validare 'results' in qualche modo prima di passarlo a' Serialise'? (Puoi riproffare la rottura del metodo serialise quando passi in certi tipi di risultati) – keyboardP

+0

@KeyboardP - la libreria di terze parti è in realtà un plug-in fornito dall'utente che implementa un'interfaccia, quindi non è affidabile. –

risposta

0

Alla fine, ho scritto un metodo di estensione WriteSubtree che dà questa API utilizzabile:

using (var resultsXml = xml.WriteSubtree("Results")) 
{ 
    ThirdPartyLibrary.Serialise(results, resultsXml); 
} 

Il metodo di estensione XmlWriter.WriteSubtree è analogo al NET di XmlReader.ReadSubtree. Restituisce uno speciale XmlWriter che controlla gli affari divertenti. Il suo metodo di smaltimento chiude tutti i tag lasciati aperti.

1

XMLWriter scrive solo le informazioni xml fornite nello stream senza alcuna convalida. Se viene eseguita una convalida durante la scrittura dei tag xml, il problema di prestazioni si presenterà durante la creazione del grande file xml.

La creazione del file XML con XMLWriter è a rischio di sviluppatori. Se si desidera eseguire questo tipo di convalida, è possibile utilizzare XMLDocument.

Se si desidera veramente eseguire questa convalida in XMLWriter, è necessario creare il writer utilizzando String o StringBuilder. Perché se usi Stream o TextWriter non puoi leggere le informazioni che sono scritte nello stream nel mezzo della scrittura. In Ogni aggiornamento dell'XML è necessario leggere la stringa e scrivere il proprio metodo per convalidare le informazioni scritte.

I Suggerisco di utilizzare XMLDocument per creare questo tipo di xml.