Все, что меньше 0x20 (за исключением 0x09, 0x0a, 0x0d, т. Е. Табуляция, возврат каретки и перевод строки), не может быть включено в документ XML.
У меня есть некоторые данные, поступающие из базы данных и передаваемые в ответ на запрос веб-службы.
Средство форматирования Soap успешно кодирует символ 0x12 (Ascii 18, Device Control 2) как 
, но ответ на клиенте не получается с шестнадцатеричным значением 0x12, это недопустимый символ
<rant>
То, что я нахожу весьма разочаровывающим, это то, что это две стороны одной медали, и клиент, и сервис являются приложениями .net. Почему средство форматирования мыла будет писать плохой xml, если ничто не может его прочитать? </rant>
Я бы тоже хотел
- Получите Сериализатор Xml для правильной обработки этих нечетных символов или
- Ошибка запроса в веб-сервисе
Я погуглил и не смог найти что-либо еще, кроме: а) «дезинфекции ваших входов» или б) «изменения структуры вашего документа».
а) Не является бегуном, поскольку некоторым из этих данных +20 лет
b) это тоже не лучший вариант, так как кроме нашего собственного внешнего интерфейса у нас есть клиенты, которые напрямую кодируют веб-службу.
Есть что-то очевидное, что я упускаю? Или это просто случай кода вокруг управляющих кодов AscII?
Спасибо
Обновление
Это на самом деле проблема с XmlSerialiser, следующий код будет сериализовать неверный символ в поток, но не десериализовать его
[Serializable]
public class MyData
{
public string Text { get; set; }
}
class Program
{
public static void Main(string[] args)
{
var myData = new MyData {Text = "hello "
+ ASCIIEncoding.ASCII.GetString(new byte[] { 0x12 })
+ " world"};
var serializer = new XmlSerializer(typeof(MyData));
var xmlWriter = new StringWriter();
serializer.Serialize(xmlWriter, myData);
var xmlReader = new StringReader(xmlWriter.ToString());
var newData = (MyData)serializer.Deserialize(xmlReader); // Exception
// hexadecimal value 0x12, is an invalid character.
}
}
Я могу заставить его душить писать xml, явно создав XmlWriter и передав его в Serialise
(я вскоре опубликую это как мой собственный ответ), но это все равно означает, что я очистить мои данные перед отправкой.
Поскольку эти символы имеют большое значение, я не могу просто удалить их, мне нужно кодировать их перед передачей и декодировать их при чтении, и я действительно очень удивлен, что, похоже, не существует существующей структуры способ сделать это.