7

这是 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[>]]>
4

3 回答 3

9

@Oded 在评论中发布了上面的参考真实答案...我想将其添加为答案,以便人们可以找到它。
如果他/她添加它,我们可以删除它。

是的,重要的是要确定你需要这样做;“CDATA”一开始就经常被误用,更不用说嵌套了。但在一些时髦的场合,我们会这样做。

-

基本计划是将嵌套 CDATA 的末端埋在另一个 CDATA 中。它将与外部 CDATA 的解释一起被剥离以离开内部。

这是来自@Oded 上面
en.wikipedia.org/wiki/CDATA#Nesting的维基百科文章

动作是替换任何内部的、嵌套的

]]>

]]]]><![CDATA[>
于 2014-04-14T19:54:02.837 回答
2

我可以给你一个发生在我身上的场景。我有一个 SharePoint 内容编辑器 Web 部件,它被导出为 .dwp(其内容包含在 CDATA 中),需要将其插入到 Visual Studio 部署包中,Elements.xml 文件中的目标位置也是数据。这有点傻,因为它只是 XML 中的 HTML 中的 XML,但它是 SharePoint,所以傻是正常的存在状态。

因此,以防万一这导致其他人访问此页面,我想我会总结一下我提出的解决方案:

1) XML 对内部 CDATA 进行编码,因此您不需要内部 CDATA。可能并不总是实用的,但在我的情况下有效。

2) 在这种情况下,还有另一个选项,将内容编辑器 Web 部件的内容移动到单独的文件,并将内容编辑器链接到该 Web 部件文件。我想这属于重新考虑你的战略方法。

3)上述将整个CDATA分成三个独立的连续CDATA的想法。虽然这是一个聪明的想法并且适用于一般情况,但我不确定这是否适用于我的情况。这是因为内容将由 2 个不同的进程传递,部署程序和页面管理器。部署者需要获取外部 CDATA 的内容并将其整个传递给页面管理器,然后页面管理器会将 CDATA 的内容作为单个元素值。使用 3 CDATA 方法,部署者会将整个内容视为单个 XML 结构,因此 HTML 实际上会被错误地解释。(我希望这是有道理的)。

于 2013-11-07T20:56:14.450 回答
0

嗨,此函数添加到 javascript 中的字符串对象,您可以将其用于任何字符串。此代码的末尾向您展示了如何使用它来解决您的问题(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[>')
 */
于 2018-01-28T05:32:55.713 回答