2012-10-16 1 views
8

Sto salvando xml da .NET XElement. Sto usando il metodo ToString, ma la formattazione non sembra come vorrei (esempi sotto). Mi piacerebbe al massimo due tag per riga. Come posso ottenerlo?Scrittura xml con al massimo due tag per riga


Salvataggio XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString() mi dà

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three<c>four</c><c>five</c></b> 
</a> 

Ma per migliorare la leggibilità avrei preferito 'tre', 'quattro' e 'cinque' erano su righe separate:

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three 
    <c>four</c> 
    <c>five</c> 
    </b> 
</a> 

Edit: Sì, capisco che questo è sintatticamente diverso e "non nello spirito di xml", ma sono pragmatico. Recentemente ho visto file xml di dimensioni megabyte con un minimo di 3 righe, che sono una sfida per editor di testo, controllo del codice sorgente e strumenti di diffusione. Qualcosa deve essere fatto! Ho provato che cambiare la formattazione sopra è compatibile con la nostra applicazione.

+2

+1 per compensare i downvotes inspiegabili. Tuttavia, questo non è ciò che XML è per. Se vuoi che sia testo semplice/formato libero, puoi usare qualcos'altro. 'xmllint --format' fa questo se ti piace – sehe

+0

Ciao Sehe. Xmllint è un programma Linux-C'è qualcosa che può essere formattato per fare questo per .NET? E cosa intendi per 'questo non è ciò che XML è per'? –

+0

Quando dici che stai cercando di migliorare la leggibilità, è giusto per quando tu (e forse altri sviluppatori) devi ispezionare il file a scopo di debug? Se si tratta di qualcosa che raramente accade in relazione alla frequenza con cui un file viene salvato, il risultato ottenuto tramite la post-elaborazione sarebbe accettabile o tutti i file devono essere salvati con lo spazio bianco extra? – jerry

risposta

3

Motivi illustrati ai colleghi: cambieremo il formato del file. Ti consiglio di provare a fare lo stesso. È quasi impossibile fare ciò che volevo, perché la maggior parte degli strumenti xml presuppongono che lo spazio sia significativo.

+3

Il problema è che hai un nodo di contenuto misto: se riesci a sbarazzartene, il rientro funzionerebbe. Prima di cambiare formato, vedi se implementare il tuo XmlWriter che metterà sempre elementi in una nuova riga può risolvere i problemi per te. –

2

XML è un formato di scambio di informazioni, destinato ai computer. Lo spazio bianco è irrilevante (in base alla posizione e allo schema, in realtà) e, in quanto tale, sarebbe arbitrario utilizzare l'uno o l'altro.

Si potrebbe usare XmlTextWriter con XElement.Save e vedere se è possibile modificarlo a vostro piacimento con la XmlWriter.Settings Property

+0

Questo è sbagliato WRT la sua domanda - ogni byte di spazi bianchi mostrato è significativo, anche se non pensiamo che sia a livello di applicazione. –

+1

@JasonViers Con tutto il rispetto, il contesto specificato dall'OP è linq-to-xml. Gli spazi bianchi non sono significativi nel campione come indicato. Lo vuole semplicemente stampato. Questa è una cosa di presentazione e linq-to-xml non la supporta direttamente. Poteva usare un XmlWriter personalizzato, anche se – sehe

+1

La tua affermazione è corretta, ma ci riferiamo a diversi contesti. A livello di applicazione, per quanto riguarda linq-to-xml, non ritiene che lo spazio sia significativo. Il serializzatore XML non sa che linq-to-xml ha questa distinzione (o la sua mancanza). Conosce solo la specifica XML e, secondo le specifiche, tutti gli spazi bianchi nel suo esempio XML IS sono significativi. –

3

La formattazione non funziona nel modo desiderato a causa del nudo "tre". C'è una ragione per cui non è nella sua etichetta? Dovrebbe essere invece un attributo di "b"?

13

Se si desidera esattamente quell'output, è necessario farlo manualmente, aggiungendo spazi bianchi attorno ai nodi secondo necessità.

Quasi tutti gli spazi bianchi nei documenti XML sono significativi, anche se si pensa solo all'indentazione. Quando chiediamo al serializzatore di rielaborare il documento per noi, sta apportando modifiche al contenuto che può essere estratto, in modo che cerchino di essere il più conservativi possibile. Gli elementi

<tag>foo</tag> 

e

<tag> 
    foo 
</tag> 

hanno contenuti diversi, e se un serializzatore ha cambiato la prima nella seconda, cambierebbe quello che si ottiene indietro dal vostro API XML quando si chiede per i contenuti dei <tag> .

La normale regola empirica è che non verrà applicato alcun rientro se esiste uno spazio vuoto non esistente tra gli elementi. In questo caso, il tuo three tra i tag verrà modificato se un serializzatore applica il rientro desiderato, quindi nulla lo farà automaticamente.


Se si ha il controllo sul formato XML, è sconsigliabile mescolare elementi di testo e bambini come questo, in cui <b> ha sia il testo (three) e l'elemento (<c>) figli, in quanto causa problemi come quello che si' sto vedendo.

0

Ho dovuto fare qualcosa di simile prima (per una richiesta del cliente). Tutto quello che ho finito è stato scrivere un metodo personalizzato .ToString() utilizzato solo per visualizzare l'XML in un browser (lo so) o per il loro utilizzo nel download di un file xml del contenuto. Poiché il codice non doveva essere efficiente dal punto di vista computazionale, si trattava semplicemente di controllare i figli di ciascun tag e di organizzare il testo "sospeso" come tale.

Alla fine siamo stati in grado di convincere l'utente che il testo dovrebbe essere invece un attributo.