는 방법이 있을 탈출 CDATA 종료 토큰에서는 xml?
문제
하면 어떤 방법을 탈출 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[>
대 ]]>
.간단합니다.