XElement.Save заставляет XmlUtf8RawTextWriter генерировать исключение - PullRequest
0 голосов
/ 07 декабря 2011

Следующее исключение произошло на компьютере клиента:

System.ArgumentException: '', hexadecimal value 0x1F, is an invalid character.
at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
at System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
at System.Xml.XmlUtf8RawTextWriterIndent.WriteString(String text)
at System.Xml.XmlWellFormedWriter.WriteString(String text)
at System.Xml.Linq.ElementWriter.WriteElement(XElement e)
at System.Xml.Linq.XElement.WriteTo(XmlWriter writer)
at System.Xml.Linq.XElement.Save(XmlWriter writer)
at System.Xml.Linq.XElement.Save(String fileName, SaveOptions options)
at System.Xml.Linq.XElement.Save(String fileName) 

К сожалению, больше информации нет.

Ошибка немного сбивает с толку.

0x1F - знак вопроса. Если вопросительный знак был включен в имя какого-либо элемента или атрибута (что является недопустимым), исключение будет выдано при создании XElement или XAttribute с недопустимым именем, а не в момент сохранения на диск.

Исключение было выдано XmlUtf8RawTextWriter классом, который XElement использует внутренне, я полагаю (приложение не использует). Нельзя ли ожидать, что XElement сам решит проблемы с кодированием и т. Д.? Что могло вызвать его падение? Это несовместимость ОС или фреймворка?

Я понимаю, что мой вопрос довольно расплывчатый, но я должен оперировать ограниченной информацией.

Буду признателен, если кто-нибудь хотя бы укажет мне правильное направление. Я не видел такой ошибки раньше.

1 Ответ

2 голосов
/ 07 декабря 2011

U + 001F - это не на самом деле знак вопроса - это управляющий символ («разделитель информации один»), который не разрешен в XML. (U + 003F - знак вопроса.)

Обычно в вашем XElement есть недопустимый символ, который нельзя правильно сохранить. Непонятно, откуда вы получаете данные, но это проблема. Вам нужно будет решить, что делать с неверными данными - просто полностью ли удалить их, каким-либо образом их избежать или что-то в этом роде.

Вот короткая, но полная программа, которая, если поможет, воспроизведет проблему:

using System;
using System.IO;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        var element = new XElement("foo", "\u001f");
        element.Save(new MemoryStream());
    }
}
...