【问题标题】:XElement.Save causes XmlUtf8RawTextWriter to throw an exceptionXElement.Save 导致 XmlUtf8RawTextWriter 引发异常
【发布时间】:2011-12-07 13:24:46
【问题描述】:

报告了在客户端计算机上发生了以下异常:

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 自己处理编码问题等吗?什么可能导致它崩溃?是操作系统或框架不兼容吗?

我知道我的问题相当模糊,但我必须根据有限的信息进行操作。

如果有人至少能指出我正确的方向,我将不胜感激。我以前从未见过这样的错误。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的提示。但是XElement 不会自动转义需要转义的字符(例如&符号等),或者将它们包装在 CDATA 块中吗?如何“手动”清理XElement 的内容?
    • @Morawski:不——您根本无法直接在 XML 中表示这些字符,甚至在 CDATA 中也不行。要进行清理,您需要编写一个方法来检查内容是否包含任何无效字符,如果是则进行替换。 (正则表达式替换 可能 最终成为最快的方法。)如果我是你,我会在它进入 XElement 之前这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多