2010-01-05 12 views
48

Ho bisogno di salvare il contenuto che contiene newline in alcuni attributi XML, non testo. Il metodo deve essere scelto in modo che sia in grado di decodificarlo in XSLT 1.0/ESXLT/XSLT 2.0Come salvare le nuove righe nell'attributo XML?

Qual è il miglior metodo di codifica?

Si prega di suggerire/dare alcune idee.

+0

possibile duplicato del [sono interruzioni di riga in attributo XML valori validi?] (Http: // StackOverflow. it/questions/449627/are-line-breaks-in-xml-attribute-values-valid) –

+0

fatto un esempio per una domanda simile: http://stackoverflow.com/a/29782321/611007 – n611x007

+0

related: https://stackoverflow.com/questions/260436/ - correlati: https://stackoverflow.com/questions/449627/ - correlati: https://stackoverflow.com/questions/1289524/ – n611x007

risposta

64

In un'API DOM compatibile non c'è nulla che devi fare. Semplicemente salva i nuovi caratteri di nuova riga nell'attributo, l'API li codificherà correttamente da solo (vedi Canonical XML spec, section 5.2).

Se fate la vostra propria codifica (vale a dire la sostituzione \n con 
 prima di salvare il valore di attributo), l'API codificherà il vostro input nuovo, con conseguente 
 nel file XML.

La riga inferiore è, il valore di stringa viene salvato letteralmente. Esci da ciò che hai inserito, senza bisogno di interferire.

Tuttavia ... alcune implementazioni non sono compatibili. Ad esempio, codificheranno i caratteri & nei valori degli attributi, ma dimenticheranno i caratteri di nuova riga o le schede. Questo ti mette in una posizione perdente poiché non puoi semplicemente sostituire le newline con 
 in anticipo.

Queste implementazioni farà risparmiare caratteri di nuova riga non codificato, in questo modo:

<xml attribute="line 1 
line 2" /> 

Al momento l'analisi di un tale documento, a capo letterali in attributi sono normalizzati in un unico spazio (ancora una volta, in accordo con la spec) - e, quindi, sono persi.

In queste implementazioni è impossibile salvare (e conservare!) Le nuove righe negli attributi.

+0

Qualcosa in cui mi sono imbattuto in: XML utilizza newline in stile Unix (LF). Quindi, se vuoi archiviare i newline in stile Windows (CR + LF), dovrai convertire le newline dopo aver letto dal tuo attributo, oppure sfuggire alle newline in qualche modo. Fonte: http://www.w3schools.com/xml/xml_syntax.asp – Joe

+2

@Joe: dove prendi le informazioni da quell'XML utilizza le newline in stile Unix? Per quanto posso vedere, [la specifica] (http://www.w3.org/TR/xml/) non lo limita. – Tomalak

+0

@Tomalak Scorri fino alla fine di quel collegamento. Cerca l'intestazione "Negozi XML nuova riga come LF". L'ho notato anche in pratica: sia XmlWriter in C# che in un componente di terze parti rimuovono i caratteri CR (lasciando solo i LF, come Unix). – Joe

37

È possibile utilizzare l'entità &#10; per rappresentare una nuova riga in un attributo XML. &#13; può essere utilizzato per rappresentare un ritorno a capo. Uno stile Windows CRLF può essere rappresentato come &#13;&#10;.

Questa è la sintassi XML legale. Vedi XML spec per maggiori dettagli.

+0

È un carattere XML valido ?? –

+0

Suppongo di dover usare qualche codifica invece dell'entità Poiché getAttribute non funziona con una stringa che contiene newline. Hai molte idee? L'entità risolverà il problema getAttribute? – Tommy

+0

@Chathuranga Chandrasekara: Sì. È un XML valido. Ho aggiornato la mia risposta per includere un collegamento alle specifiche XML in cui sono menzionati questi simboli. – Asaph

0

Una risposta greggio può essere:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(@"Agenda.xml"); 
//make stuff with the xml 
//make attributes value = "\r\n" (you need both expressions to make a new line) 
string a = xDoc.InnerXml.Replace("&#xD;", "\r").Replace("&#xA;", "\n").Replace("><",">\r \n<"); 
StreamWriter sDoc = new StreamWriter(@"Agenda.xml"); 
sDoc.Write(a); 
sDoc.Flush(); 
sDoc.Dispose(); 

Questa volontà, come si vede è solo una stringa

Problemi correlati