2012-07-13 10 views
6

Zgodnie z tym pytanie:LINQ to XML ignoruje podziały wiersza w atrybutach

Are line breaks in XML attribute values allowed?

Linia wybucha w atrybutach XML są doskonale ważny (choć może nie zalecane):

<xmltag1> 
    <xmltag2 attrib="line 1 
line 2 
line 3"> 
    </xmltag2> 
</xmltag1> 

Kiedy analizowania taki XML używający LINQ do XML (System.Xml.Linq), te linie podziału są przekształcane w trybie cichym na znaki spacji ' '.

Czy istnieje sposób, aby powiedzieć parserowi XDocument.Load(), aby zachować te linie podziału?

P.S .: Plik XML, który parsuję, jest zapisywany przez oprogramowanie innej firmy, więc nie mogę zmienić sposobu zapisywania linii.

+0

Jeśli piszesz atrybuty programowo, spójrz na ten artykuł, który pokazuje różne sposoby unikania ciągu znaków.http: //weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape- An-XML-string-in-C.aspx pamiętać, że nie tylko trzeba łamać linie. –

Odpowiedz

9

Jeśli chcesz zachować podział na wiersze w wartościach atrybutów, musisz je zapisać z odniesieniami do znaków, np.

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/> 

jako inny mądry parser XML normalizuje je do pomieszczeń, zgodnie ze specyfikacją XML http://www.w3.org/TR/xml/#AVNormalize.

[edit] Jeśli chcesz uniknąć normalizację wartości atrybutu następnie ładuje plik XML z dziedzictwem XmlTextReader pomaga:

  string testXml = @"<foo bar=""Line 1. 
Line 2. 
Line 3.""/>"; 

      XDocument test; 
      using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml))) 
      { 
       xtr.Normalization = false; 
       test = XDocument.Load(xtr); 
      } 
      Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value); 

która wyprowadza

|Line 1. 
Line 2. 
Line 3.| 
+0

Dziękuję, ale jak napisałem w moim pytaniu, XML jest napisany przez oprogramowanie innej firmy, więc nie mogę tego zmienić. Być może potrzebuję jakiegoś RegEx wymienić, który zamienia przerwy linii na – cheeesus

+0

Widziałem tę notatkę w twoim pytaniu, ale w tym przypadku istnieje jasna specyfikacja, a otrzymany wynik jest zgodny ze specyfikacją. Tak więc napisałem tę odpowiedź, aby wskazać, że zachowanie, które otrzymujesz, jest właściwe, nawet jeśli nie jest potrzebne w twoim przypadku. Myślę, że starsze '' XmlTextReader' pozwala jednak uniknąć normalizacji wartości atrybutu, więc zmienię moją odpowiedź, aby to pokazać. –

+0

dziękuję! 'XmlTextReader' wykonuje zadanie – cheeesus

0

podziały wierszy nie obowiązuje, gdy analizowany (nie kod ASCII 32), jeśli przejdziesz przez każdą literę, zobaczysz, że "spacja" "jest kodem ASCII 10 = LF (LineFeed) (!!) - więc linie podziału nadal są obecne , jeśli potrzebujesz spróbować zastąpić je z ASCII 13 w kodzie ... (pola tekstowe (Windows Forms) nie pokazuje LF jako LINEBREAK)

+0

Dziękuję, przetestowałem to wcześniej i naprawdę mam dwa 32-znakowe znaki ASCII, w których powinny znajdować się podziały wiersza. Mam zamiar przetestować to jeszcze raz, aby się upewnić. – cheeesus

+1

Przetestowałem to ponownie. Oba znaki '' \ r'' i ''\ n'' w atrybucie XML są konwertowane na spacje' '' '(kod ASCII 32). – cheeesus

+0

u'r right - dotyczy sekcji z cdata - nie można znaleźć obecnie sposobu na zachowanie linebreaków. to jest przeplot 32 32 na LB opcja dla ciebie? – Cadburry

0

Według MSDN:

Chociaż procesory XML zachować wszystkie spacje w zawartości pierwiastków, często normalizować je w wartościach atrybutów. Tabulatory, powrót karetki i spacje są zgłaszane jako pojedyncze spacje. W niektórych typach atrybutów przycinają one białą przestrzeń przed lub po głównym ciele wartości i zmniejszają białą przestrzeń w obrębie wartości do pojedynczych spacji. (Jeśli DTD jest dostępny, to przycinanie będą wykonywane na wszystkich atrybutów, które nie są typu CDATA.)

Na przykład, dokument XML może zawierać następujące:

raporty parsera
<whiteSpaceLoss note1="this is a note." note2="this 
is 
a 
note."> 

XML zarówno wartości atrybutów: "this is a note.", przekształcając podziały wierszy w pojedyncze spacje.

Nie mogę znaleźć nic na temat zachowania białych znaków atrybutów, ale według tego wyjaśnienia może to być niemożliwe.