다음과 같은 문자열을 보유한 일부 XML로 작업하고 있습니다.
<node>This is a string</node>
내가 노드에 전달하고있는 문자열 중 일부는 것입니다 문자처럼 &
, #
, $
, 등 :
<node>This is a string & so is this</node>
로 인해 유효하지 않습니다 &
.
이 문자열을 그대로 그대로 CDATA에 래핑 할 수 없습니다. CDATA에 있지 않고 XML 노드에 넣을 수없는 문자 목록을 찾으려고했습니다.
누군가 나를 지시하거나 불법적 인 인물 목록을 제공 할 수 있습니까?
답변
유일한 불법 문자는 &
, <
그리고 >
(물론 "
나 '
속성에서).
그들은를 빠져있는 XML 엔티티를 원하는이 경우, &
위해 &
.
그러나 실제로 XML을 작성하고 이러한 종류의 내용을 추상화하는 도구 또는 라이브러리를 사용해야하므로 걱정할 필요가 없습니다.
답변
자, 다음과 같은 문자에 대한 질문을 분리합시다.
- XML 문서에서 전혀 유효하지 않습니다.
- 탈출해야합니다.
@dolmen이 ” XML의 유효하지 않은 문자 란 무엇입니까? “에서 제공 한 답변 은 여전히 유효하지만 XML 1.1 사양으로 업데이트해야합니다.
1. 잘못된 문자
여기에 설명 된 문자는 XML 문서에 삽입 할 수있는 모든 문자입니다.
1.1. XML 1.0에서
허용되는 문자의 전체 목록은 다음과 같습니다.
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
기본적으로 제어 문자 및 유니 코드 범위를 벗어난 문자는 허용되지 않습니다. 이것은 또한 예를 들어 캐릭터 엔티티의 호출 
이 금지됨을 의미합니다.
1.2. XML 1.1에서
허용되는 문자의 전체 목록은 다음과 같습니다.
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
XML 권장 사항의이 개정은 허용 문자를 확장하여 제어 문자가 허용되며 유니 코드 표준의 새로운 개정을 고려하지만 NUL (x00) , xFFFE , xFFFF …
그러나 제어 문자 및 정의되지 않은 유니 코드 문자를 사용하지 않는 것이 좋습니다.
모든 파서가이를 항상 고려하지는 않으며 제어 문자가있는 XML 문서는 거부 될 수 있습니다.
2. 제대로 구성된 문서를 얻기 위해 이스케이프해야하는 문자 :
는 <
로 이스케이프해야 <
이 태그의 시작으로 간주되기 때문에, 엔티티.
는 &
로 이스케이프해야합니다 &
시작하는 엔티티 참조로 간주되기 때문에, 엔티티
는 >
로 이스케이프해야합니다 >
엔티티. 필수는 아니며 상황에 따라 다르지만 탈출하는 것이 좋습니다.
는 '
로 이스케이프해야 '
엔티티 – 작은 따옴표 내에 정의 된 속성에 필수 있지만 강력 항상 탈출하는 것이 좋습니다.
는 "
로 이스케이프해야 "
엔티티 – 따옴표로 정의 된 속성에 필수 있지만 강력 항상 탈출하는 것이 좋습니다.
답변
유효한 문자 목록은 XML 사양에 있습니다 .
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
답변
문자열에서 XML 유효하지 않은 문자를 제거하고 유효한 새 문자열을 반환하는 C # 코드입니다.
public static string CleanInvalidXmlChars(string text)
{
// From xml spec valid chars:
// #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
// any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]";
return Regex.Replace(text, re, "");
}
답변
답변
CDATA 블록을 사용하여 탈출하려는 경우 potame의 답변 외에도.
텍스트 를 CDATA 블록에 넣으면 escaping을 사용할 필요가 없습니다 . 이 경우 다음 범위의 모든 문자를 사용할 수 있습니다 .
참고 : 그 외에도 ]]>
문자 시퀀스 를 사용할 수 없습니다 . CDATA 블록의 끝과 일치하기 때문입니다.
여전히 유효하지 않은 문자 (예 : 제어 문자)가있는 경우 일종의 인코딩 (예 : base64)을 사용하는 것이 좋습니다.
답변
C #에서 잠재적으로 원하지 않는 XML / XHTML 문자를 피하는 또 다른 쉬운 방법은 다음과 같습니다.
WebUtility.HtmlEncode(stringWithStrangeChars)