如何在XML属性中保存换行符?

时间:2010-01-05 05:45:25

标签: xml xslt newline

我需要在一些XML属性中保存包含换行符的内容,而不是文本。 应该选择该方法,以便我能够在XSLT 1.0 / ESXLT / XSLT 2.0中对其进行解码

最好的编码方法是什么?

请建议/提出一些想法。

4 个答案:

答案 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("&#xD;", "\r").Replace("&#xA;", "\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 = '&#10;';
    var lineBreakCharacterThatGetsLost = '&#xD;';
    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);
}

当然,您可以根据您的数据情况调整行或不行的换行符,并且可以将它们循环使用,以查找一组行不通的字符,并循环遍历它们做一整套换行符。