programing

XML에서 잘못된 문자는 무엇입니까?

sourcejob 2023. 9. 16. 08:58
반응형

XML에서 잘못된 문자는 무엇입니까?

저는 다음과 같은 문자열을 저장하는 XML 작업을 하고 있습니다.

<node>This is a string</node>

노드에 전달하는 문자열 중 일부는 다음과 같은 문자를 가질 것입니다.&,#,$ :

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

이는 다음으로 인해 유효하지 않습니다.&.

이 문자열들을 그대로 CDATA로 포장할 수는 없습니다.CDATA가 아니면 XML 노드에 넣을 수 없는 문자 목록을 찾아 보았습니다.

누군가 나에게 하나의 방향을 알려주거나 불법 캐릭터 목록을 제공해줄 수 있습니까?

자, 그럼 등장인물에 대한 질문을 분리해 보겠습니다.

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

@dolmen이 "https://stackoverflow.com/questions/730133/invalid-characters-in-xml/5110103#5110103 "에서 제공한 답변은 여전히 유효하지만 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. */

기본적으로 유니코드 범위를 벗어나는 컨트롤 문자와 문자는 허용되지 않습니다. 개체은한를어자를는다을r을는sgot를한은seyer를 &#x3;금지되어 있습니다.

XML 1.1에서 1.2.

허용되는 문자의 글로벌 목록은 다음과 같습니다.

[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. 탈출해야 하는 문자(잘 구성된 문서를 얻기 위해):

<고야다ahe으로 탈출해야 합니다.&#60;입니다.

&고야다ahe으로 탈출해야 합니다.&#38; 참조의 엔터티 참조는로티에기티티y,를기t는로ee티g

>께야함함야hedd와께로 탈출해야 함&#62; 이를 것이 .그것은 의무적인 것은 아니지만 -- 상황에 따라 다릅니다 -- 하지만 그것을 피하는 것이 강력히 권고됩니다.

'야다 탈출해야 합니다.&#39;- 내에 이지만 항상.일 -표에된는만상다는이y다이는상y-oy-만ydy는ts된t에

"야다 탈출해야 합니다.&#34;entity - 내에 이지만 항상 -표에된는만상는다이다이는y--y상tosy표만ydsdn

유효한 문자 목록은 XML 규격에 있습니다.

Char       ::=      #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

입니다.&,<그리고.>만 아니라)"아니면'속성 하는 데 되는 문자에 :성을는데는에성라:성라에n성을는는s데 :attr="must use &quot; here, ' is allowed"그리고.attr='must use &apos; here, " is allowed').

XML 엔티티를 사용해서 탈출하는 거죠 이 경우엔&amp;위해서&.

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

문자열에서 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 블록을 사용하여 탈출하고 싶은 경우.

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

graphical representation of possible characters

: 에 할 할 에 ]]>◦ ∙ 끝과 입니다.왜냐하면 CDATA 블록의 끝과 일치하기 때문입니다.

만약 여전히 유효하지 않은 문자(예: 제어 문자)가 있다면, 아마도 어떤 종류의 인코딩(예: base64)을 사용하는 것이 더 나을 것입니다.

C#에서 잘못된 XML 문자를 제거하는 또 다른 방법은 (이후 사용 가능)을 사용하는 것입니다.NET Framework 4.0)

public static string RemoveInvalidXmlChars(string content)
{
   return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}

또는 모든 문자가 XML로 유효한지 확인할 수 있습니다.

public static bool CheckValidXmlChars(string content)
{
   return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}

.넷 피들

들어 탭 기호를 ( )\v은 XML에 , 1, 포함)에서도하지 않은 XML을 UTF-8은 XML 1.0, libxml2는 XML에 유효하지 않습니다.

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

WebUtility.HtmlEncode(stringWithStrangeChars)

클래스 Class)가 .StringEscapeUtils), method를 것 된 입니다 이 입니다 된 이 .escapeXmlXML 엔티티를 사용하여 문자열의 문자를 탈출하는 데 사용할 수 있습니다.

"XmlWriter 및 하위 ASCII 문자"가 효과적이었습니다.

string code = Regex.Replace(item.Code, @"[\u0000-\u0008,\u000B,\u000C,\u000E-\u001F]", "");

요약하면 텍스트에 유효한 문자는 다음과 같습니다.

  • 탭, 라인 피드 및 캐리지 리턴.
  • 다음을 제외한 모든 비제어 문자가 유효합니다. &그리고.<.
  • >다음과 같은 경우 유효하지 않습니다.]].

XML 명세의 섹션 2.2와 2.4에서는 다음과 같은 답변을 자세히 제공합니다.

성격.

법적 문자는 탭, 캐리지 리턴, 라인 피드 및 유니코드 및 ISO/IEC 10646의 법적 문자입니다.

문자 데이터

앰퍼샌드 문자(&)와 왼쪽 각괄호(<)는 마크업 구분자로 사용되거나 주석, 처리 명령어 또는 CDATA 섹션 내에 사용되는 경우를 제외하고는 문자 형태로 나타나지 않아야 합니다.다른 곳에서 필요한 경우 숫자 문자 참조 또는 "&" 및 "<" 문자열을 각각 사용하여 해당 문자를 제거해야 합니다.오른쪽 각괄호(>)는 문자열 " >"를 사용하여 나타낼 수 있으며, 호환성을 위해 해당 문자열이 CDATA 섹션의 끝을 표시하지 않는 경우 내용의 문자열 " ]>"에 표시될 때 " >" 또는 문자 참조를 사용하여 탈출해야 합니다.

ampersand (&) is escaped to &amp;

double quotes (") are escaped to &quot;

single quotes (') are escaped to &apos; 

less than (<) is escaped to &lt; 

greater than (>) is escaped to &gt;

C#에서 사용System.Security.SecurityElement.Escape아니면System.Net.WebUtility.HtmlEncode이런 불법적인 캐릭터들을 피해가기 위해서입니다.

string xml = "<node>it's my \"node\" & i like it 0x12 x09 x0A  0x09 0x0A <node>";
string encodedXml1 = System.Security.SecurityElement.Escape(xml);
string encodedXml2= System.Net.WebUtility.HtmlEncode(xml);


encodedXml1
"&lt;node&gt;it&apos;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"

encodedXml2
"&lt;node&gt;it&#39;s my &quot;node&quot; &amp; i like it 0x12 x09 x0A  0x09 0x0A &lt;node&gt;"

Woodstox XML 프로세서에서 잘못된 문자는 다음 코드로 분류됩니다.

if (c == 0) {
    throw new IOException("Invalid null character in text to output");
}
if (c < ' ' || (c >= 0x7F && c <= 0x9F)) {
    String msg = "Invalid white space character (0x" + Integer.toHexString(c) + ") in text to output";
    if (mXml11) {
        msg += " (can only be output using character entity)";
    }
    throw new IOException(msg);
}
if (c > 0x10FFFF) {
    throw new IOException("Illegal unicode character point (0x" + Integer.toHexString(c) + ") to output; max is 0x10FFFF as per RFC");
}
/*
 * Surrogate pair in non-quotable (not text or attribute value) content, and non-unicode encoding (ISO-8859-x,
 * Ascii)?
 */
if (c >= SURR1_FIRST && c <= SURR2_LAST) {
    throw new IOException("Illegal surrogate pair -- can only be output via character entities, which are not allowed in this content");
}
throw new IOException("Invalid XML character (0x"+Integer.toHexString(c)+") in text to output");

출처: 여기서

아무나 이거 먹어봤어요.System.Security.SecurityElement.Escape(yourstring)? 문자열의 잘못된 XML 문자를 올바른 동등 문자로 바꿉니다.

XSL의 경우(정말 게으른 날에는) 다음과 같이 사용합니다.

capture="&amp;(?!amp;)" capturereplace="&amp;amp;"

psignsamp;를 따르지 않는 모든 &amp; 를 적절한 것으로 번역합니다.

입력이 CDATA에 있지만 XML을 사용하는 시스템에서는 이를 고려하지 않는 경우가 있습니다.엉성한 해결책이니 조심해서...

언급URL : https://stackoverflow.com/questions/730133/what-are-invalid-characters-in-xml

반응형