2012-07-13 10 views
6

Nach dieser Frage:LINQ to XML ignoriert Zeilenumbrüche in Attribute

Are line breaks in XML attribute values allowed?

Zeilenumbrüche in XML-Attribute perfekt gültig sind (wenn auch vielleicht nicht empfohlen):

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

Wenn ich analysieren solche XML mit LINQ to XML (System.Xml.Linq), diese Zeilenumbrüche werden still in den Raum ' ' Zeichen konvertiert.

Gibt es eine Möglichkeit, dem Parser XDocument.Load() mitzuteilen, diese Zeilenumbrüche beizubehalten?

P.S .: Das XML, das ich analysiere, wird von Software von Drittanbietern geschrieben, daher kann ich die Art, wie die Zeilenumbrüche geschrieben werden, nicht ändern.

+0

Wenn Sie Attribute programmatisch schreiben, schauen Sie sich diesen Artikel an, der verschiedene Möglichkeiten zeigt, wie man string.http: //weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape- An-XML-String-in-C.aspx Beachten Sie, dass nicht nur Zeilenumbrüche maskiert werden müssen. –

Antwort

9

Wenn Sie möchten, dass Zeilenumbrüche in Attributwerten beibehalten werden, müssen Sie sie mit Zeichenreferenzen schreiben, z.

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

als andere weise der XML-Parser wird sie auf Räume normalisieren, nach der XML-Spezifikation http://www.w3.org/TR/xml/#AVNormalize.

[Bearbeiten] Wenn Sie den Attributwert Normalisierung dann Laden der XML mit einem Legacy-XmlTextReader hilft vermeiden wollen:

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

Das gibt

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

Vielen Dank, aber wie ich in meiner Frage geschrieben habe, wird das XML von einer Software von Drittanbietern geschrieben, also kann ich das nicht ändern. Vielleicht brauche ich eine Art RegEx ersetzen, die die Zeilenumbrüche konvertiert – cheeesus

+0

Ich sah diese Notiz in Ihrer Frage, aber in diesem Fall gibt es eine klare Spezifikation und das Ergebnis erhalten Sie mit der Spezifikation übereinstimmt. Also habe ich diese Antwort geschrieben, um darauf hinzuweisen, dass das Verhalten, das du bekommst, das richtige ist, auch wenn es in deinem Fall nicht gewünscht ist. Ich denke, ein Legacy-'XmlTextReader' erlaubt es Ihnen jedoch, die Attributwertnormalisierung zu vermeiden, also werde ich meine Antwort bearbeiten, um das zu zeigen. –

+0

danke! der 'XmlTextReader' erledigt den Job – cheeesus

0

die Zeilenumbrüche sind keine Leerzeichen, wenn analysiert (nicht ASCII-Code 32) Wenn Sie durch jeden Buchstaben gehen, sehen Sie, dass das "Leerzeichen" ein ASCII-Code ist 10 = LF (LineFeed) (!!) - also sind die Zeilenumbrüche immer noch vorhanden wenn Sie versuchen, zu ersetzen sie mit einem ASCII 13 in Ihrem Code ... (Textfelder (Windows-Formen) nicht LF als Zeilenumbruch angezeigt)

+0

Danke, ich habe das vorher getestet, und ich habe wirklich zwei ASCII-Code 32 Zeichen, wo die Zeilenumbrüche sein sollten. Ich werde das nochmal testen, um sicher zu gehen. – cheeesus

+1

Ich habe es erneut getestet. Die Zeichen '\ r'' und' \ n'' im XML-Attribut werden in '' '' Leerzeichen (ASCII-Code 32) konvertiert. – cheeesus

+0

Ihr Recht - das gilt für einen cdata-Abschnitt - konnte derzeit keine Möglichkeit finden, die Zeilenumbrüche beizubehalten. ist ein Platz von 32 32 für LB eine Option für Sie? – Cadburry

0

Nach MSDN:

Obwohl XML-Prozessoren alle Leerzeichen in Elementinhalt erhalten, sie normalisieren es häufig in Attributwerten. Registerkarten, Wagenrücklaufzeichen und Leerzeichen werden als einzelne Leerzeichen gemeldet. Bei bestimmten Attributtypen wird der Leerraum vor oder nach dem Hauptteil des Werts gekürzt und der Leerraum innerhalb des Werts auf einzelne Leerstellen reduziert. (Wenn eine DTD vorhanden ist, wird dieses Trimmen auf alle Attributen durchgeführt werden, die nicht vom Typ CDATA ist.)

Zum Beispiel kann ein XML-Dokument enthält möglicherweise die folgenden:

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

Ein XML-Parser Berichte sowohl Attributwerte wie "this is a note.", Konvertieren der Zeilenumbrüche in einzelne Leerzeichen.

Ich kann nichts über das Erhalten von Leerzeichen der Attribute finden, aber ich denke, dass es gemäß dieser Erklärung unmöglich sein kann.