문제

하면 어떤 방법을 탈출 CDATA 종료 토큰(]]>)에 CDATA 섹션에서는 xml 문서입니다.또는 더 일반적으로있는 경우에는 일부 탈출 시퀀스가 사용에 대한 내 CDATA(지만 존재하는 경우에,나는 그것이면 아마 단지해 탈출을 시작 또는 끝,토큰 어쨌든).

기본적으로,당신이 시작하거나 종료 토큰에 포함 CDATA 게 파서하지 않을 해석하는 그것만으로 취급하는 또 다른 문자열.

아마 한,당신은 리팩터링 xml 구조 또는 당신의 코드는 경우에 당신은 자신을 발견하려고 하는,그러나 비록 나 xml 작업에서 매일이 마지막 3 년 동안 또는 그래서 나는 결코 이 문제는데 그것이 가능했습니다.그냥 호기심.

편집:

보를 사용하여 html 인코딩...

도움이 되었습니까?

해결책

명확하게 이 질문은 순수 학문.다행히도,그것은 매우 명확한 대답합니다.

당신은 피할 수 없 CDATA end 시퀀스입니다.생산 규칙의 20XML 사양 은 매우 분명:

[20]    CData      ::=      (Char* - (Char* ']]>' Char*))

편집:이 제품의 규칙을 말 그대로"CData 섹션에 포함될 수 있 당신이 원하는 무엇이든지만 시퀀스']]>'.도 예외는 아니다.".

EDIT2:이 같은 섹션 또한 읽습니다.

CDATA 섹션 내에만 CDEnd 문자열로 인식 태그,그래서는 각괄호 및 앰퍼샌드에서 발생할 수 있습을 직 양식그들은 그가 필요한 것은 아닙니다(수 없을)수 있를 사용하여 이스케이프"<"및"&".CDATA 섹션할 수 없습니다.

다시 말해서,그것은 사용할 수 없는 엔티티에 참조,이윤 또는 그 밖의 형태의 해석되는 구문을 사용합니다.유일한 구문 분석된 텍스트 안에 CDATA 섹션 ]]>, 을 종료합니다.

따라서,그것은 가능하지 않은 탈출 ]]> 에 CDATA 섹션입니다.

EDIT3:이 같은 섹션 또한 읽습니다.

2.7CDATA 섹션

[정의:CDATA 섹션에서 발생할 수 있습니다 어디에서든 문자 데이터가 발생할 수 있습니다;는 그 사용을 탈출하의 블록을 포함하는 텍스트 문자는 그렇지 않으로 인정 마크업이 있습니다.CDATA 섹션에서 문자열로 시작하"<![CDATA[" and end with the string "]]>":]

다이 있을 수 있습 CDATA 섹션을 어디서든 문자 데이터가 발생할 수 있습 등 여러 인접 CDATA 섹션 내부의 하나의 CDATA 섹션입니다.할 수 있도록 가능한 분할 ]]> 토큰을 넣어 두 부분에서의 인접 CDATA 섹션이 있습니다.

ex:

<![CDATA[Certain tokens like ]]> can be difficult and <invalid>]]> 

으로 작성되어야

<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid>]]> 

다른 팁

당신이 휴식으로 데이터를 조각을 은폐하는 ]]>.

여기의 모든 것:

<![CDATA[]]]]><![CDATA[>]]>

첫번째 <![CDATA[]]]]>]].두 번째 <![CDATA[>]]>>.

당신은 탈출하지 않은 ]]> 하지만 당신은 탈출 > 후에 ]] 를 삽입하여 ]]><![CDATA[>, 생각의 이처럼 \ C/Java/PHP/Perl 문자열에만 필요하기 전에 >]].

BTW,

S. 로트의 대답과 같이 다르게 표시.

S.롯의 대답은 오른쪽:당신이하지 않는 인코딩 끝 태그가,당신은 휴식을 여러 CDATA 섹션이 있습니다.

를 실행하는 방법에 걸쳐 이 문제는 현실 세계에서:XML 편집기를 사용하여 XML 문서를 작성하는 것입니다 먹이로 콘텐츠 관리 시스템 문서를 작성하려고에 대해 CDATA 섹션이 있습니다.일반 속을 포함하는 코드 샘플 CDATA 섹션에서 실패할 것이다 당신은 여기에.당신이 상상할 수 있는 방법을 배운다.

하지만 대부분의 상황에서,당신은 당신 없이,그리고 여기에는 이유:을 저장하려는 경우(예)의 텍스트는 XML 문서의 내용으로 XML 요소,당신은 아마 사용 돔 방법,예를 들어:

XmlElement elm = doc.CreateElement("foo");
elm.InnerText = "<[CDATA[[Is this a problem?]]>";

고 DOM 매우 합리적으로 탈출 < 고>의미하지 않은 실수로 임베디드 CDATA 섹션에서 당신의 문서입니다.

아,그리고 이것은 재미있:

XmlDocument doc = new XmlDocument();

XmlElement elm = doc.CreateElement("doc");
doc.AppendChild(elm);

string data = "<![[CDATA[This is an embedded CDATA section]]>";
XmlCDataSection cdata = doc.CreateCDataSection(data);
elm.AppendChild(cdata);

이것은 아마 ideosyncrasy 니다.NET DOM,하지만 그를 버리지 않는 예외입니다.예외가 발생됩 여기:

Console.Write(doc.OuterXml);

나는 생각에서 어떤 일이 발생 후드는 XmlDocument 를 사용하 XmlWriter 생산 출력,그리고 XmlWriter 검사에 대한 올바른 형식으로 기록합니다.

단순히 교체 ]]>]]]]><![CDATA[>

여기에 또 다른 경우에는 ]]> 될 필요가 탈출했다.우리가 필요한 완벽한 유효한 HTML 문서 내부에 CDATA 블록 XML 문서는 HTML 소스에 일어나는 자신의 CDATA 니다.예를 들어:

<htmlSource><![CDATA[ 
    ... html ...
    <script type="text/javascript">
        /* <![CDATA[ */
        -- some working javascript --
        /* ]]> */
    </script>
    ... html ...
]]></htmlSource>

이 댓글을 CDATA 접미사 요구를 변경할 수 있습니다.

        /* ]]]]><![CDATA[> *//

부터 XML parser 지 않을 처리하는 방법을 알 javascript 코멘트 블록

PHP 에서: '<![CDATA['.implode(explode(']]>', $string), ']]]]><![CDATA[>').']]>'

리 PHP:

   function safeCData($string)
   {
      return '<![CDATA[' . str_replace(']]>', ']]]]><![CDATA[>', $string) . ']]>';
   }

을 사용하는 것을 잊지 마세 멀티바이트-안전 str_replace 필요한 경우(비 latin1 $string):

   function mb_str_replace($search, $replace, $subject, &$count = 0)
   {
      if (!is_array($subject))
      {
         $searches = is_array($search) ? array_values($search) : array ($search);
         $replacements = is_array($replace) ? array_values($replace) : array ($replace);
         $replacements = array_pad($replacements, count($searches), '');
         foreach ($searches as $key => $search)
         {
            $parts = mb_split(preg_quote($search), $subject);
            $count += count($parts) - 1;
            $subject = implode($replacements[$key], $parts);
         }
      }
      else
      {
         foreach ($subject as $key => $value)
         {
            $subject[$key] = mb_str_replace($search, $replace, $value, $count);
         }
      }
      return $subject;
   }

다른 솔루션은 교체 ]]> by ]]]><![CDATA[]>.

이 구조

<![CDATA[
   <![CDATA[
      <div>Hello World</div>
   ]]]]><![CDATA[>
]]>

에 대한 내부 CDATA 태그(s)해야 합니다 가까운로 ]]]]><![CDATA[>]]>.간단합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top