XElement.Save导致XmlUtf8RawTextWriter抛出异常

时间:2011-12-07 13:24:46

标签: c# xml exception .net-3.5 xelement

据报道,客户端计算机上发生了以下异常:

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是一个问号。如果某个元素或属性的名称中包含问号(这是非法的),则在创建名称无效的XElementXAttribute时会抛出异常,而不是保存到磁盘。

XmlUtf8RawTextWriter类引发了异常,这是XElement内部使用的猜测(应用程序没有)。不能期望XElement自己处理编码问题等吗?什么可能导致它崩溃?是一些操作系统或框架不兼容吗?

我理解我的问题很模糊,但我必须对有限的信息进行操作。

如果有人能够至少指出我正确的方向,我会很感激。我之前没有看到过这样的错误。

1 个答案:

答案 0 :(得分:2)

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());
    }
}