2010-01-05 15 views
48

Potrzebuję zapisać treść zawierającą znaki nowej linii w niektórych atrybutach XML, a nie w tekście. Metoda powinna zostać wybrana, aby można ją było dekodować w XSLT 1.0/ESXLT/XSLT 2.0Jak zapisać znaki nowej linii w atrybucie XML?

Jaka jest najlepsza metoda kodowania?

Proszę zasugerować/podać kilka pomysłów.

+0

możliwym duplikatu [Czy podziały wiersza w wartości atrybutu XML ważne?] (Http: // stackoverflow. com/questions/449627/is-line-breaks-in-xml-attribute-values-valid) –

+0

zrobił przykład podobnego pytania: http://stackoverflow.com/a/29782321/611007 – n611x007

+0

powiązane: https://stackoverflow.com/questions/260436/ - pokrewne: https://stackoverflow.com/questions/449627/ - pokrewne: https://stackoverflow.com/questions/1289524/ – n611x007

Odpowiedz

64

W zgodnym interfejsie DOM API nic nie trzeba robić. Po prostu zapisz faktyczne znaki nowej linii do atrybutu, API zakoduje je poprawnie samodzielnie (patrz Canonical XML spec, section 5.2).

Jeśli zrobić własne kodowanie (tj zastępując \n z 
 przed zapisaniem wartość atrybutu), API zakoduje swój wkład ponownie, powodując 
 w pliku XML.

Dolna linia to, że wartość ciągu jest zapisana dosłownie. Dostajesz to, co wkładasz, nie musisz się wtrącać.

Jednak niektóre implementacje są niezgodne. Na przykład będą kodować znaki & w wartościach atrybutów, ale zapomnieć o znakach nowej linii lub kartach. To stawia cię w pozycji przegranej, ponieważ nie możesz po prostu zastąpić nowych linii z wyprzedzeniem 
.

te implementacje uratuje znaki nowej linii odkodowane, tak:

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

Podczas analizowania takiego dokumentu, literalne znaki nowej linii w atrybutach są znormalizowane do jednego miejsca (ponownie, zgodnie z spec) - a więc oni są zgubieni.

Zapisywanie (i zatrzymywanie!) Znaków nowej linii w atrybutach jest niemożliwe w tych implementacjach.

+0

Coś, na co natknąłem się: XML używa nowych linii w stylu Unix (LF). Więc jeśli chcesz przechowywać znaki nowej linii w stylu Windows (CR + LF), musisz przekonwertować nowe linie po przeczytaniu z atrybutu lub jakoś uciec przed znakami. Źródło: http://www.w3schools.com/xml/xml_syntax.asp – Joe

+2

@Joe: Skąd czerpiesz informacje z tego XML używa nowych linii w stylu Unix? O ile widzę, [specyfikacja] (http://www.w3.org/TR/xml/) nie ogranicza tego. – Tomalak

+0

@ Tomalak Przewiń w dół do tego łącza. Poszukaj nagłówka "XML Przechowuje nową linię jako LF". Zauważyłem to również w praktyce - zarówno XmlWriter w C#, jak iw komponencie 3rd party usuwa znaki CR (pozostawiając tylko LF, jak Unix). – Joe

37

Można użyć jednostki &#10; do reprezentowania nowej linii w atrybucie XML. &#13; może służyć do reprezentowania powrotu karetki. Styl CRLF w stylu okna może być reprezentowany jako &#13;&#10;.

To jest prawidłowa składnia XML. Aby uzyskać więcej informacji, patrz XML spec.

+0

Czy jest to prawidłowy znak XML? –

+0

Chyba muszę użyć kodowania zamiast encji Ponieważ getAttribute nie będzie działał z łańcuchem zawierającym znak nowej linii. Czy masz wiele pomysłów? Czy jednostka rozwiązuje problem getAttribute? – Tommy

+0

@Chathuranga Chandrasekara: Tak. To jest poprawny XML. Zaktualizowałem swoją odpowiedź, dodając link do specyfikacji XML, w której wymienione są te symbole. – Asaph

0

Surowy odpowiedź może być:

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(); 

będzie to, jak widać to tylko ciąg

Powiązane problemy