Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Save导致XmlUtf8RawTextWriter引发异常_C#_Xml_Exception_.net 3.5_Xelement - Fatal编程技术网

C# Save导致XmlUtf8RawTextWriter引发异常

C# Save导致XmlUtf8RawTextWriter引发异常,c#,xml,exception,.net-3.5,xelement,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

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

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自己处理编码问题等吗?是什么导致它坠毁的?是操作系统还是框架不兼容

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

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

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:No-您不能直接在XML中表示这些字符,甚至不能在CDATA中表示。要进行清理,您需要编写一个方法来检查内容是否包含任何无效字符,如果包含,则进行替换。(一个正则表达式替换可能是最快的方法。)如果我是你,我会在进入XElement之前,在进入的路上做。