Как удалить недопустимые шестнадцатеричные символы из источника данных на основе XML до создания XmlReader или XPathDocument, который использует данные? - PullRequest
73 голосов
/ 21 августа 2008

Существует ли какой-либо простой / общий способ очистки источника данных на основе XML перед его использованием в XmlReader, чтобы я мог корректно использовать данные XML, которые не соответствуют ограничениям шестнадцатеричных символов, установленным для XML?

Примечание:

  • Решение должно обрабатывать XML источники данных, которые используют символ кодировки, отличные от UTF-8, например от указав кодировку декларация XML-документа. Не искажение кодировки символов источник во время удаления недействительным шестнадцатеричные символы были главная точка соприкосновения.
  • Удаление недопустимых шестнадцатеричных символов должно удалять только шестнадцатеричные закодированные значения, так как вы часто можете найти значения href в данных, которые содержат строку, которая будет совпадением строки для шестнадцатеричного символа.

Справка:

Мне нужно использовать источник данных на основе XML, который соответствует определенному формату (например, Atom или RSS-каналы), но я хочу иметь возможность использовать опубликованные источники данных, которые содержат недопустимые шестнадцатеричные символы в соответствии со спецификацией XML.

В .NET, если у вас есть Stream, который представляет источник данных XML, а затем пытаетесь проанализировать его с помощью XmlReader и / или XPathDocument, возникает исключение из-за включения недопустимых шестнадцатеричных символов в данные XML. Моя текущая попытка решить эту проблему - проанализировать Stream как строку и использовать регулярное выражение для удаления и / или замены недопустимых шестнадцатеричных символов, но я ищу более производительное решение.

Ответы [ 14 ]

0 голосов
/ 21 ноября 2016

Используйте эту функцию для удаления недопустимых символов xml.

public static string CleanInvalidXmlChars(string text)   
{   
       string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]";   
       return Regex.Replace(text, re, "");   
} 
0 голосов
/ 09 мая 2011

Вы можете передавать не-UTF символы следующим образом:

string sFinalString  = "";
string hex = "";
foreach (char ch in UTFCHAR)
{
    int tmp = ch;
   if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
    {
    sFinalString  += ch;
    }
    else
    {  
      sFinalString  += "&#" + tmp+";";
    }
}
0 голосов
/ 17 августа 2010

Попробуйте это для PHP!

$goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);
0 голосов
/ 19 февраля 2010
private static String removeNonUtf8CompliantCharacters( final String inString ) {
    if (null == inString ) return null;
    byte[] byteArr = inString.getBytes();
    for ( int i=0; i < byteArr.length; i++ ) {
        byte ch= byteArr[i]; 
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        if ( !( (ch > 31 && ch < 253 ) || ch == '\t' || ch == '\n' || ch == '\r') ) {
            byteArr[i]=' ';
        }
    }
    return new String( byteArr );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...