这是XML文档中的问题:
<![CDATA[<b>Title</b>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
]]>
我需要在此文本中插入CDATA表达式。怎么做 ? (如果我喜欢这个,我会在评估文件中看到错误)
<![CDATA[]]]]>Expression<![CDATA[>]]>
答案 0 :(得分:8)
@Oded在评论中发布了上面的参考真实答案...我想将其添加为答案,以便人们可以找到它。
如果他/她添加了它,我们可以删除它。
是的,确实你需要这样做很重要; “CDATA”通常首先被误用,更不用说嵌套了。 但在我们做的一些时髦的场合。
基本计划是将嵌套CDATA的结尾埋在另一个CDATA中。 它将被剥夺外部CDATA的解释以留下内在。
这是@Oded上面的维基百科文章 en.wikipedia.org/wiki/CDATA#Nesting
动作是替换任何内部嵌套
]]>
与
]]]]><![CDATA[>
答案 1 :(得分:2)
我可以给你一个发生在我身上的情景。我有一个SharePoint内容编辑器Web部件导出为.dwp(其内容包装在CDATA中)并需要将其插入到Visual Studio部署包中,Elements.xml文件中的目标位置也是CDATA。这有点傻,因为它只是XML格式的XML,但是它的SharePoint是如此愚蠢才是正常的存在状态。
所以,为了防止其他人访问此页面,我想我会总结出我提出的解决方案:
1)XML编码内部CDATA,因此您不需要内部CDATA。可能并不总是实用,但在我的情况下工作。
2)在这种情况下,还有另一个选项,将Content Editor Web部件的内容移动到单独的文件,并将Content Editor链接到该Web部件文件。我想这是在重新思考你的战略方法。
3)将整个CDATA分成三个独立的连续CDATA的上述想法。虽然这是一个聪明的想法,并适用于一般情况,但我不确定这在我的情况下是否有效。这是因为内容将由2个不同的进程传递,即部署者,然后是页面管理器。部署者需要获取外部CDATA的内容并将其全部传递给页面管理器,然后页面管理器将CDATA的内容作为单个元素值。使用3 CDATA方法,部署者将整个内容视为单个XML结构,因此HTML实际上被错误地解释。 (我希望这是有道理的)。
答案 2 :(得分:0)
这个函数在javascript中添加到string对象,你可以将它用于任何字符串。这段代码的结尾向您展示如何使用它来解决您的问题(seiied mahmood mirkhalili(majb.ms@gmail.com) ))
/**
* replace pattern with relative of nested pattern (a pattern in another patern)
* @param {string} input [match of regreplace]
* @param {string} input1 [match firstgroup of regreplace ]
* @param {string} input2 [match second group of regreplace ]
* @return {string} [replace string with pattern ]
*/
String.prototype.relativeInnerReplaceFunction = function (input , input1 , input2){
var firstMatch = input1.match(this.regfirst);
if(firstMatch != undefined){
firstMatch = firstMatch.length
} else {
firstMatch = 0 ;
}
var lastMatch = input1.match(this.regEnd);
if(lastMatch != undefined){
lastMatch = lastMatch.length ;
} else {
lastMatch = 0 ;
}
if(input1 != undefined && input1 != 404){
var relativeInnerReplaceFunction = this.relativeInnerReplaceFunction.bind(this);
input1 = input1.replace(this.regReplace , relativeInnerReplaceFunction) ;
}
var numLoop = firstMatch - lastMatch - 1;
if(input2 != undefined){
for (var i = 0; i < numLoop; i++) {
input2 = input2.replace(this.regReplace , this.pattern);
}
} else {
input2 = '' ;
}
return input1+input2 ;
};
/**
* replace recuresive pattern for solve problem cdata in cdata mor info in this link https://stackoverflow.com/questions/13865357/nested-cdata-correctly
* @param {regular experssion} regfirst [the start pattern ]
* @param {regular experssion} regEnd [the end pattern ]
* @param {regular experssion} regReplace [the pattern for nested replace]
* @param {string} pattern [the pattern will replace with regReplce regular pattern in nested replace]
* @return {string} [string after calculate nested pattern and replace with regreplace ]
*/
String.prototype.relativeInnerReplace = function (regfirst , regEnd, regReplace , pattern){
this.regfirst = regfirst ;
this.regEnd = regEnd ;
this.regReplace = regReplace ;
this.pattern = pattern ;
var relativeInnerReplaceFunction = this.relativeInnerReplaceFunction.bind(this);
var output = this.replace(regReplace , relativeInnerReplaceFunction) ;
return output ;
}
/*how to use
for example for nested cdata problem 'search in stackoverflow'
wpsExample.relativeInnerReplace(/<!\[CDATA\[/g , /\]\]>/g , /^(.*)(\]\]>)/g , '$1]]]]><![CDATA[>')
*/