xml에서 CDATA end 토큰을 피할 수 있는 방법이 있습니까?
CDATA 종료 토큰을 피할 수 있는 방법이 있는지 궁금합니다 (]]>
xml 문서의 CDATA 섹션 내에 있습니다.또는 일반적으로 CDATA 내에서 사용할 수 있는 이스케이프 시퀀스가 존재하는 경우(그러나 존재하는 경우에는 시작 토큰이나 종료 토큰을 이스케이프하는 것만 의미가 있을 것으로 생각됩니다).
기본적으로 시작 또는 종료 토큰을 CDATA에 내장하고 파서에게 해석하지 말고 다른 문자 시퀀스로 처리하라고 말할 수 있습니다.
아마 xml 구조나 코드를 리팩터링 해야 할 것 같은데, 지난 3년 정도 xml을 매일 사용해왔고 이런 문제가 발생한 적이 없는데도 가능한지 궁금합니다.그냥 호기심 때문에.
편집:
html 인코딩을 사용하는 것 외에...
당신은 당신의 데이터를 조각조각 쪼개야만 그 정보를 숨길 수 있습니다.]]>
.
이게 전부입니다.
<![CDATA[]]]]><![CDATA[>]]>
첫번째<![CDATA[]]]]>
가 있습니다.]]
. 두번째<![CDATA[>]]>
가 있습니다.>
.
CDATA 종료 시퀀스를 벗어날 수 없습니다.XML 규격의 생산 규칙 20은 매우 명확합니다.
[20] CData ::= (Char* - (Char* ']]>' Char*))
편집: 이 제품 규칙은 문자 그대로 "CD 데이터 섹션에는 '[]]> 순서를 제외하고 원하는 모든 것이 포함될 수 있습니다.예외는 없습니다."
EDIT2: 동일한 섹션에도 다음과 같은 내용이 있습니다.
CDATA 섹션 내에서 CDEnd 문자열만 마크업으로 인식되므로 왼쪽 각괄호와 앰퍼샌드가 문자 그대로의 형태로 발생할 수 있습니다.
<
" 그리고"&
". CDATA 섹션을 네스팅할 수 없습니다.
즉, 엔티티 참조, 마크업 또는 다른 형태의 해석 구문을 사용할 수 없습니다.CDATA 섹션 내에서 유일하게 구문 분석된 텍스트는]]>
, 그리고 그 구간을 끝냅니다.
그러므로 탈출할 수는 없습니다.]]>
CDATA 섹션 내에 있습니다.
EDIT3: 동일한 섹션에도 다음과 같은 내용이 있습니다.
2.7 CDATA 섹션
[정의: CDATA 섹션은 문자 데이터가 발생할 수 있는 모든 장소에서 발생할 수 있습니다. 그렇지 않으면 마크업으로 인식될 수 있는 문자가 포함된 텍스트 블록을 벗어나는 데 사용됩니다.CDATA 섹션은 "<![CDATA["]를 선택하고 문자열 "]로 끝냅니다.>":]
그러면 단일 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[
전에>
을 해 보세요.\
PHP이지만 C/Java/PHP/다하지만하기 합니다.>
에 a.]]
.
그건 그렇고.
S.롯데의 대답은 이것과 같고, 단지 단어만 다릅니다.
S. Lott의 대답은 옳습니다. 엔드 태그를 인코딩하는 것이 아니라 여러 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);
이것은 아마도 의 아이디어 합성일 것입니다.NET DOME, 하지만 예외는 아닙니다.여기에 예외가 적용됩니다.
Console.Write(doc.OuterXml);
내 생각에 그 후드 아래에서 일어나고 있는 일은 XmlDocument가 XmlWriter 출력을 사용하고 있고 XmlWriter가 쓰기 시작할 때 제대로 형성되었는지 확인하는 것입니다.
또 다른 ]]>
탈출해야 합니다 한 HTML 해야 하는데 자체 있다고 합니다.XML 문서의 CDATA 블록 안에 완벽하게 유효한 HTML 문서를 저장해야 하는데 HTML 소스에 자체 CDATA 블록이 있다고 가정해 보겠습니다.예를 들어,
<htmlSource><![CDATA[
... html ...
<script type="text/javascript">
/* <![CDATA[ */
-- some working javascript --
/* ]]> */
</script>
... html ...
]]></htmlSource>
주석이 달린 CDATA 접미사를 다음과 같이 변경해야 합니다.
/* ]]]]><![CDATA[> *//
XML 파서는 자바스크립트 주석 블록을 처리하는 방법을 알지 못할 것이기 때문입니다.
PHP 에서:'<![CDATA['.implode(explode(']]>', $string), ']]]]><![CDATA[>').']]>'
PHP의 보다 깨끗한 방법:
function safeCData($string)
{
return '<![CDATA[' . str_replace(']]>', ']]]]><![CDATA[>', $string) . ']]>';
}
안전 를 사용하는 str_replace 를( 1)).$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;
}
CDATA 엔드 태그를 끊어도 작동된다는 것만 덧붙이고 싶습니다.]]>
사이에]]
과 같이: , :]
]]><![CDATA[
]>
전과가 있는
<![CDATA[Certain tokens like ]]]><![CDATA[]> can be difficult and <valid> but <unconventional>]]>
그러나, 그것은 세계적으로 받아들여지는 관습입니다.]]>
전에>
여기 다른 답변들과 같이.
<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid> and <conventional>]]>
다음 구조 참조:
<![CDATA[
<![CDATA[
<div>Hello World</div>
]]]]><![CDATA[>
]]>
CDATA 를 .]]]]><![CDATA[>
]]>
그렇게 간단합니다.
언급URL : https://stackoverflow.com/questions/223652/is-there-a-way-to-escape-a-cdata-end-token-in-xml
'source' 카테고리의 다른 글
각도 2 - 외부 URL로 리디렉션하고 새 탭에서 엽니다. (0) | 2023.10.09 |
---|---|
자바스크립트 / jQuery:윈도우에 포커스가 있는지 테스트 (0) | 2023.10.09 |
창에서 sys/socket.h 기능 사용 (0) | 2023.10.09 |
SQL Server 2008 GUI에 고유한 제약 조건을 추가하시겠습니까? (0) | 2023.10.09 |
정규 표현식에서 (?s)의 의미 (0) | 2023.10.09 |