Jak zapisać nowe linie w atrybucie XML?

Muszę zapisać zawartość, która zawiera nowe linie w niektórych atrybutach XML, a nie tekst. Metoda powinna być wybrana tak, że jestem w stanie ją dekodować w XSLT 1.0 / ESXLT / XSLT 2.0

Jaka jest najlepsza metoda kodowania?

Proszę zasugerować / podać jakieś pomysły.

Author: David Hall, 2010-01-05

3 answers

W zgodnym API DOM nie ma nic do zrobienia. Po prostu zapisz rzeczywiste znaki nowej linii do atrybutu, API zakoduje je poprawnie samodzielnie(zobacz Canonical XML spec, sekcja 5.2).

Jeśli wykonasz własne kodowanie (tj. zastąpienie \n przez 
 przed zapisaniem wartości atrybutu), API ponownie zakoduje twoje wejście , co spowoduje 
 w pliku XML.

Podsumowując, wartość łańcucha jest zapisywana dosłownie. Wyciągasz to, co wkładasz nie musisz się wtrącać.

Jednak ... niektóre implementacje nie są zgodne. Na przykład kodują znaki & w wartościach atrybutów, ale zapominają o znakach nowej linii lub tabulaturach. To stawia cię w pozycji przegranej, ponieważ nie możesz po prostu zastąpić nowych linii 
 wcześniej.

Te implementacje zapisują niezakodowane znaki nowej linii, jak to:

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

Podczas analizowania takiego dokumentu, literalne nowe linie w atrybutach są znormalizowane do pojedyncza przestrzeń (ponownie, zgodnie ze specyfikacją) - i w ten sposób są one utracone.

Oszczędzanie (i zatrzymywanie!) nowe linie w atrybutach są niemożliwe w tych implementacjach.

 66
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-11 07:59:31

Możesz użyć encji &#10; do reprezentowania nowej linii w atrybucie XML. &#13; może być używany do reprezentowania powrotu karetki. CRLF w stylu windows może być reprezentowany jako &#13;&#10;.

Jest to legalna składnia XML. Zobacz XML spec aby uzyskać więcej szczegółów.

 39
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-05 06:19:01

Prymitywna odpowiedź może brzmieć:

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

This will as you see is just a string

 0
Author: rosca dragos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 19:28:33