我需要在一些XML属性中保存包含换行符的内容,而不是文本。 应该选择该方法,以便我能够在XSLT 1.0 / ESXLT / XSLT 2.0中对其进行解码
最好的编码方法是什么?
请建议/提出一些想法。
答案 0 :(得分:69)
在兼容的DOM API中,您无需做任何事情。只需将实际换行符保存到属性中,API就会自行编码(请参阅Canonical XML spec, section 5.2)。
如果您执行自己的编码(即在保存属性值之前将\n
替换为
),API将再次对输入进行编码,从而生成{{1在XML文件中。
底线是,字符串值是逐字保存的。你得到你放入的东西,不需要干涉。
然而 ...某些实施不符合规定。例如,他们将在属性值中编码

个字符,但忘记换行符或制表符。由于您无法事先用&
替换换行符,因此这会使您处于失败状态。
这些实现将保存未编码的换行符,如下所示:
在解析这样的文档时,属性中的文字换行符被标准化为单个空格(同样,根据规范) - 因此它们会丢失。
在这些实现中,不可能在属性中保存(并保留!)换行符。
答案 1 :(得分:41)
您可以使用实体
来表示XML属性中的换行符。
可用于表示回车。 Windows样式CRLF可以表示为
。
这是合法的XML语法。有关详细信息,请参阅XML spec。
答案 2 :(得分:0)
粗略回答可以是:
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("
", "\r").Replace("
", "\n").Replace("><",">\r \n<");
StreamWriter sDoc = new StreamWriter(@"Agenda.xml");
sDoc.Write(a);
sDoc.Flush();
sDoc.Dispose();
如您所见,这只是一个字符串
答案 3 :(得分:0)
一种稍微不同的方法,在某些情况下很有用-
占位符和查找并替换。
在解析之前,您可以简单地使用自己的自定义换行标记/占位符,然后在第二种情况下,只需将其替换为有效的换行符即可,无论是\ n还是\ n 要么 或#&10;或\ u2028或其他各种换行符。首先在数据中设置您自己的占位符后,再查找并替换它们。
当类似jQuery $ .parseXML()的解析器去除未编码的换行符时,这很有用。例如,您可以使用{LBREAK}作为换行符,在原始文本中插入它,然后在解析为XML对象之后将其替换。 String.replaceAll()是有用的原型。
使用jquery和replaceAll原型的粗略代码概念(尚未测试此代码,但它将显示该概念):
function onXMLHandleLineBreaks(_result){
var lineBreakCharacterThatGetsLost = ' ';
var lineBreakCharacterThatGetsLost = '
';
var rawXMLText = _result; // hold as text only until line breaks are ready
rawXMLText = String(rawXMLText).replaceAll(lineBreakCharacterThatGetsLost, '{mylinebreakmarker}'); // placemark the linebreaks with a regex find and replace proto
var xmlObj = $.parseXML(rawXML); // to xml obj
$(xmlObj).html( String(xmlObj.html()).replaceAll('{mylinebreakmarker}'), lineBreakCharacterThatWorks ); // add back in line breaks
console.log('xml with linebreaks that work: ' + xmlObj);
}
当然,您可以根据您的数据情况调整行或不行的换行符,并且可以将它们循环使用,以查找一组行不通的字符,并循环遍历它们做一整套换行符。