xml encode c#




C#에서 잘못된 XML 문자 이스케이프 (4)

Irishman에서 제공 한 RemoveInvalidXmlChars 메서드는 서로 게이트 문자를 지원하지 않습니다. 테스트하려면 다음 예제를 사용하십시오.

static void Main()
{
    const string content = "\v\U00010330";

    string newContent = RemoveInvalidXmlChars(content);

    Console.WriteLine(newContent);
}

빈 문자열을 반환하지만 그렇지 않아야합니다! U+10330 문자가 유효한 XML 문자이기 때문에 "\ U00010330"을 반환해야합니다.

서로 게이트 문자를 지원하려면 다음 방법을 사용하는 것이 좋습니다.

public static string RemoveInvalidXmlChars(string text)
{
    if (string.IsNullOrEmpty(text))
        return text;

    int length = text.Length;
    StringBuilder stringBuilder = new StringBuilder(length);

    for (int i = 0; i < length; ++i)
    {
        if (XmlConvert.IsXmlChar(text[i]))
        {
            stringBuilder.Append(text[i]);
        }
        else if (i + 1 < length && XmlConvert.IsXmlSurrogatePair(text[i + 1], text[i]))
        {
            stringBuilder.Append(text[i]);
            stringBuilder.Append(text[i + 1]);
            ++i;
        }
    }

    return stringBuilder.ToString();
}

잘못된 XML 문자가 포함 된 문자열이 있습니다. 어떻게 문자열을 구문 분석하기 전에 잘못된 XML 문자를 이스케이프 (또는 제거) 할 수 있습니까?


xml을 작성하는 경우 프레임 워크에서 제공하는 클래스를 사용하여 XML을 작성하면됩니다. 탈출이나 다른 것에 신경 쓰지 않아도됩니다.

Console.Write(new XElement("Data", "< > &"));

출력

<Data>&lt; &gt; &amp;</Data>

형식이 잘못된 XML 파일을 읽어야하는 use 정규식을 use 하지 마십시오 . 대신, Html Agility Pack을 사용하십시오.


잘못된 XML 문자를 제거하는 방법으로 XmlConvert.IsXmlChar 메서드를 사용하는 것이 좋습니다. .NET Framework 4부터 추가되었으며 Silverlight에서도 제공됩니다. 다음은 작은 샘플입니다.

void Main() {
    string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    content = RemoveInvalidXmlChars(content);
    Console.WriteLine(IsValidXmlString(content)); // True
}

static string RemoveInvalidXmlChars(string text) {
    var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
    return new string(validXmlChars);
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

그리고 잘못된 XML 문자를 이스케이프하는 방법으로 XmlConvert.EncodeName 메서드를 사용하는 것이 좋습니다. 다음은 작은 샘플입니다.

void Main() {
    const string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    string encoded = XmlConvert.EncodeName(content);
    Console.WriteLine(IsValidXmlString(encoded)); // True

    string decoded = XmlConvert.DecodeName(encoded);
    Console.WriteLine(content == decoded); // True
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

갱신 : 인코딩 조작이 소스 문자열의 길이보다 크거나 같은 길이의 스트링을 생성한다는 점을 언급해야합니다. 길이 제한이있는 문자열 열의 데이터베이스에 인코딩 된 문자열을 저장하고 데이터 열 제한에 맞게 앱의 소스 문자열 길이의 유효성을 검사 할 때 중요 할 수 있습니다.


SecurityElement.Escape 사용

using System;
using System.Security;

class Sample {
  static void Main() {
    string text = "Escape characters : < > & \" \'";
    string xmlText = SecurityElement.Escape(text);
//output:
//Escape characters : &lt; &gt; &amp; &quot; &apos;
    Console.WriteLine(xmlText);
  }
}






escaping