我正在反序列化以下XML文件。将XML序列化程序与VSTS 2008 + C#+ .Net 3.5一起使用。
这是XML文件。
<?xml version="1.0" encoding="utf-8"?>
<Person><Name>=b?olu</Name></Person>
以下是用于显示XML文件的屏幕快照和XML文件的二进制格式
如果有一些解决方案可以接受这样的角色,那就太棒了!由于我的XML文件很大,如果这些字符真的无效且应该被过滤,我希望在反序列化后保留XML文件的剩余内容。
目前,XML反序列化因InvalidOperationException而失败,整个XML文件信息将丢失。
实际上,当在VSTS中打开这个XML文件时,会出现这样的错误,错误1字符'?',十六进制值0xffff在XML文档中是非法的。我很困惑,因为在二进制形式中,没有0xffff值。
任何解决方案或想法?
EDIT1:这是我的代码,用于反序列化XML文件,
static void Foo()
{
XmlSerializer s = new XmlSerializer(typeof(Person));
StreamReader file = new StreamReader("bug.xml");
s.Deserialize(file);
}
public class Person
{
public string Name;
}
答案 0 :(得分:1)
这种风格有帮助吗?
<name>
<![CDATA[
=b?olu
]]>
</name>
或者encoding应该做的伎俩。
编辑:找到此页面:http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp。具体来说,这个反序列化代码:
public Object DeserializeObject(String pXmlizedString)
{
XmlSerializer xs = new XmlSerializer(typeof(Automobile));
MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
return xs.Deserialize(memoryStream);
}
关于“StringToUTF8ByteArray”和“Encoding.UTF8”这一部分看起来很奇怪。我猜.NET不喜欢读取实际XML文件的编码......?
答案 1 :(得分:1)
您是否尝试过DataContractSerializer?我遇到了一个有趣的情况,当有人将一些单词或excel内容复制并粘贴到我的Web应用程序中时:该字符串包含一些无效的控制字符(例如垂直制表符)。令我惊讶的是,这是在将其发送到WCF服务时序列化的,甚至在请求时回读100%原始版本。纯.net环境没有这个问题,所以我假设DataContractSerializer可以处理这些东西(但是恕我直言,这违反了XML规范)。
我们有另一个Java客户端访问相同的服务 - 它在收到此记录时失败了......
[以下评论中的丑陋格式编辑]
试试这个:
DataContractSerializer serializer = new DataContractSerializer(typeof(MyType));
using (XmlWriter xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8))
{
serializer.WriteObject(xmlWriter, instanceOfMyType);
}
using (XmlReader xmlReader = new XmlTextReader(filePath))
{
MyType = serializer.ReadObject(xmlReader) as MyType;
}
第二个Marc的评论是关于DataContractSerializers习惯制作XmlElements而不是XmlAttributes:
<AnElement>value</AnElement>
而不是
<AnElement AnAttribute="value" />
答案 2 :(得分:0)
“无效字符”看起来可能是编码的Unicode字符。也许他们使用了错误的编码?
您能否向本文档的发起人询问他们意味着包含在该位置的字符?也许问他们如何生成文件?