据报道,客户端计算机上发生了以下异常:
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
自己处理编码问题等吗?什么可能导致它崩溃?是一些操作系统或框架不兼容吗?
我理解我的问题很模糊,但我必须对有限的信息进行操作。
如果有人能够至少指出我正确的方向,我会很感激。我之前没有看到过这样的错误。
答案 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());
}
}