2015-11-20 49 views
2

在SQL Server 2014中,我嘗試使用XML數據類型上的'modify'方法添加一個帶有屬性(包含回車符)的XML元素。 回車被刪除 - 爲什麼?爲什麼在SQL Server中執行XML屬性時會刪除回車符?

實施例:

declare @xmldata xml 

select 
    @xmldata = '<root><child myattr="carriage returns &#xD;&#xA; are not a problem"></child></root>' 

set 
    @xmldata.modify('insert <child>modifying text with carriage returns works&#xD;&#xA;ok</child> after (//child)[1]') 

set 
    @xmldata.modify('insert <child myattr="but not&#xD;&#xA;attribute values... why is that?"></child> after (//child)[2]') 

select @xmldata 

結果:

<root> 
    <child myattr="carriage returns &#xD;&#xA; are not a problem" /> 
    <child>modifying text with carriage returns works 
ok</child> 
    <child myattr="but not attribute values... why is that?" /> 
</root> 

回答

3

空白字符可以通過解析器進行歸一化。

CF http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize

當你的XML是有效的,空間到底有白色呈現依賴於實現。正如你所看到的,crlf被替換爲一個空格。

請注意

一般XML不同的工作與內容結構/元數據

屬性值被認爲標籤之間的結構和數據被視爲內容。

在XML的設計中,從未期望屬性會顯示在最終用戶設備上,我建議您爲此最終用戶內容製作另一個標籤。

+0

這不是一個渲染問題,因爲CRLF在第一個示例中被正確存儲和呈現()。 –

+0

@ThomasBoelSigurdsson ---你錯了......作爲規範說呈現一個的要求比呈現其他的要求不同。我強烈建議你閱讀的XML規範它不長,你可以看到標籤atrributes規則是如何比文檔內容的規則有很大不同。但應該清楚的是......一個是「內容」,另一個是結構或元數據。 – Hogan

+0

我不想跟你不同意 - 但我認爲你錯了。請再看看我的例子。我有兩個元素都有所謂的「myattr」的屬性。這兩個屬性都應該有一個回車符+換行符 - 但只有其中一個屬於。使用「修改」方法創建的那個不像他們以某種方式被剝離。 –

3

Section 3.3.3, Attribute-Value Normalization

一個屬性的值被傳遞到檢查其有效性的應用或 之前,XML處理器必須通過應用下面的算法,或通過使用一些其他標準化屬性 值方法 ,使得傳遞給應用程序的值與算法產生的值相同。

  1. 所有換行符必須被歸輸入到#xA在2.11結束行處理所描述的,所以這種算法 的其餘部分以這種方式標準化文本操作。
  2. 以由空字符串組成的標準化值開始。
  3. 對於在非標準化的屬性值中的每個字符,實體引用或字符引用,與第一和 持續到最後開始,請執行下列操作:

    對於一個字符引用,被引用的字符附加到標準化值。 對於實體引用,遞歸地將此算法的第3步應用於實體的替換文本。 對於空格字符(#x20,#xD,#xA,#x9),請將空格字符(#x20)附加到標準化值。 對於另一個字符,將字符附加到規範化的值。 如果屬性類型不是CDATA,則XML處理器必須進一步通過丟棄任何 前緣和後空間(#X20)字符,並通過由單個空間置換的空間(#X20)字符 序列處理的歸一化的屬性值(#x20) 字符。

XML規範要求,在屬性的CR/LF被轉換爲單個空格。

相關問題