XML에서 유효하지 않은 문자 등 : <node>This

다음과 같은 문자열을 보유한 일부 XML로 작업하고 있습니다.

<node>This is a string</node>

내가 노드에 전달하고있는 문자열 중 일부는 것입니다 문자처럼 &, #, $, 등 :

<node>This is a string & so is this</node>

로 인해 유효하지 않습니다 &.

이 문자열을 그대로 그대로 CDATA에 래핑 할 수 없습니다. CDATA에 있지 않고 XML 노드에 넣을 수없는 문자 목록을 찾으려고했습니다.

누군가 나를 지시하거나 불법적 인 인물 목록을 제공 할 수 있습니까?



답변

유일한 불법 문자는 &, <그리고 >(물론 "'속성에서).

그들은를 빠져있는 XML 엔티티를 원하는이 경우, &amp;위해 &.

그러나 실제로 XML을 작성하고 이러한 종류의 내용을 추상화하는 도구 또는 라이브러리를 사용해야하므로 걱정할 필요가 없습니다.


답변

자, 다음과 같은 문자에 대한 질문을 분리합시다.

  1. XML 문서에서 전혀 유효하지 않습니다.
  2. 탈출해야합니다.

@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. */

기본적으로 제어 문자 및 유니 코드 범위를 벗어난 문자는 허용되지 않습니다. 이것은 또한 예를 들어 캐릭터 엔티티의 호출 &#x3;이 금지됨을 의미합니다.

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. 제대로 구성된 문서를 얻기 위해 이스케이프해야하는 문자 :

<로 이스케이프해야 &lt;이 태그의 시작으로 간주되기 때문에, 엔티티.

&로 이스케이프해야합니다 &amp;시작하는 엔티티 참조로 간주되기 때문에, 엔티티

>로 이스케이프해야합니다 &gt;엔티티. 필수는 아니며 상황에 따라 다르지만 탈출하는 것이 좋습니다.

'로 이스케이프해야 &apos;엔티티 – 작은 따옴표 내에 정의 된 속성에 필수 있지만 강력 항상 탈출하는 것이 좋습니다.

"로 이스케이프해야 &quot;엔티티 – 따옴표로 정의 된 속성에 필수 있지만 강력 항상 탈출하는 것이 좋습니다.


답변

유효한 문자 목록은 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, "");
}


답변

사전 선언 된 문자는 다음과 같습니다.

& < > " '

자세한 내용은 ” XML의 특수 문자 란 무엇입니까? “를 참조하십시오.


답변

CDATA 블록을 사용하여 탈출하려는 경우 potame의 답변 외에도.

텍스트 를 CDATA 블록에 넣으면 escaping을 사용할 필요가 없습니다 . 이 경우 다음 범위의 모든 문자를 사용할 수 있습니다 .

가능한 문자의 그래픽 표현

참고 : 그 외에도 ]]>문자 시퀀스 를 사용할 수 없습니다 . CDATA 블록의 끝과 일치하기 때문입니다.

여전히 유효하지 않은 문자 (예 : 제어 문자)가있는 경우 일종의 인코딩 (예 : base64)을 사용하는 것이 좋습니다.


답변

C #에서 잠재적으로 원하지 않는 XML / XHTML 문자를 피하는 또 다른 쉬운 방법은 다음과 같습니다.

WebUtility.HtmlEncode(stringWithStrangeChars)