2012-07-13 73 views
6

換行符根據這樣一個問題:的LINQ to XML忽略屬性

Are line breaks in XML attribute values allowed?

換行符在XML屬性是完全有效的(儘管也許不推薦):

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

當我解析這種XML使用LINQ to XML(System.Xml.Linq),那些換行符會默默轉換爲空格' '個字符。

有什麼辦法可以告訴XDocument.Load()解析器保留這些換行符嗎?

P.S .:我解析的XML是由第三方軟件編寫的,所以我不能改變換行符的寫法。

+0

如果你編寫屬性編程方式看看這篇文章,它顯示了不同的字符串轉義方式.http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape- an-XML-string-in-C.aspx請記住,不僅換行符必須轉義。 – 2012-07-13 08:48:57

回答

9

如果您想要保留屬性值中的換行符,那麼您需要使用字符引用來編寫它們。

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

其他明智的XML解析器將它們歸爲空格,根據XML規範http://www.w3.org/TR/xml/#AVNormalize

[編輯]如果你想避免的屬性值規範化,然後用傳統的加載XML XmlTextReader幫助:

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

輸出解析時

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

謝謝,但正如我在我的問題中寫的,XML是由第三方軟件編寫的,所以我無法改變這一點。也許我需要某種RegEx替換,它將換行符轉換爲 – cheeesus 2012-07-13 08:49:17

+0

我在你的問題中看到了這個註釋,但在這種情況下,有一個清晰的規範,你得到的結果符合規範。所以我寫了這個答案,指出你得到的行爲是正確的,即使你的情況並不需要。我認爲一個傳統的'XmlTextReader'可以讓你避免屬性值標準化,所以我會編輯我的答案來證明這一點。 – 2012-07-13 09:21:52

+0

謝謝! 'XmlTextReader'完成這項工作 – cheeesus 2012-07-13 09:31:22

0

換行符不是空格(不是ASCII碼32),如果你逐字通過每一個字母,你會看到「空格」是一個ASCII碼10 = LF(LineFeed)(!!) - 所以如果你需要嘗試替換,換行符仍然存在 他們在你的代碼中使用ASCII 13 ...(文本框(Windows窗體)沒有表現出LF作爲換行符)

+0

謝謝,我之前測試過,並且我真的有兩個ASCII碼32個字符,換行符應該是。我會再次測試一下,以確保。 – cheeesus 2012-07-13 08:53:05

+1

我再次測試它。 XML屬性中的''r'和''\ n''字符都被轉換爲空格(ASCII碼32)。 – cheeesus 2012-07-13 08:56:37

+0

我們正確 - 適用於cdata部分 - 找不到目前保存換行符的方法。是32 32到LB的一個選項嗎? – Cadburry 2012-07-13 09:21:32

0

根據MSDN

雖然XML處理器保持在元素內容中的所有空白,它們經常在屬性值正常化它。標籤,回車和空格報告爲單個空格。在某些類型的屬性中,它們修剪出在值的主體之前或之後出現的空白空間,並將值內的空白空間減少爲單個空間。 (如果DTD是可用的,該修整將在那些類型CDATA不是所有屬性執行。)

例如,XML文檔可能包含以下內容:

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

XML解析器報告都屬性值爲"this is a note.",將換行符轉換爲單個空格。

我找不到任何關於保留屬性的空格,但我想根據這個解釋可能是不可能的。