String.Replace не заменяет шестнадцатеричный символ - PullRequest
4 голосов
/ 31 марта 2012

У меня есть класс, украшенный атрибутами XML, такими как [XmlAttribute ("att")]. Моя цель - создать XDocument с xml этого класса. Все отлично работает, за исключением персонажа '0x1f', который иногда выходит на сцену извне. Поэтому, естественно, я пытаюсь заменить его так:

XmlSerializer serializer = new XmlSerializer(this.GetType());
StringWriter sw = new StringWriter();
serializer.Serialize(sw, this);
string s = sw.ToString();
s = s.Replace((char)0x1F, ' ');
XDocument xs = XDocument.Parse(s);
return xs;

Однако я все еще получаю ошибку: "'', шестнадцатеричное значение 0x1F, является недопустимым символом."

Просто для проверки работоспособности, вот скриншот: http://i.imgur.com/jZRWg.png

Есть идеи, где я могу пойти не так?

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

Символ x1F недопустим в XML 1.0.Так что парсеры XML его отвергнут.Это допустимо в XML 1.1 при условии, что оно написано в экранированном виде  - но не все поддерживают XML 1.1.Лучше всего выяснить, где этот персонаж входит в систему, и остановить его в источнике.

2 голосов
/ 31 марта 2012

Вы получите тот же ответ, если он будет представлен как сущность - может быть, так и происходит? Посмотрите на s, чтобы быть уверенным.

Пример:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        string xml = "<foo>&#31;</foo>";
        XDocument.Parse(xml);
    }
}
1 голос
/ 11 декабря 2012

Для меня возникли некоторые проблемы, если вы попытаетесь заменить, используя строку вместо символа.Я предлагаю попробовать некоторые значения тестирования, используя оба, чтобы увидеть, что они показывают.Кроме того, как вы ссылаетесь, это имеет некоторый эффект.

var a = x.IndexOf('\u001f');                      // 513
var b = x.IndexOf(Convert.ToString((byte)0x1F));  // -1
x = x.Replace(Convert.ToChar((byte)0x1F), ' ');   // Works
x = x.Replace(Convert.ToString((byte)0x1F), " "); // Fails

Я облажался

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...