额地神啊,救救我吧,转换成xml的问题

hanshuai888 2010-09-16 06:29:27
我的一个xml文件是压缩的,我用WebClient的DownloadData方法下载后放到byte[]中,转换成Stream,然后用SharpZipLib中的UnZip方法解压并读取到StringBuilder中,最后把StringBuilder转换成string。最终发现string的值确实是xml解压后的内容,但是用XmlDocument.LoadXml(string)把string转换成xml时总是报错。只能把string前面一部分转换成xml,后面就转不了了。我试过改编码方式了,还是这样。有高人知道这是怎么回事吗?
...全文
238 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2010-09-17
  • 打赏
  • 举报
回复
建议你对发送前Zip之后的Buffer,以及接受完成之后未做Unzip之前的Buffer做一下比较,确定是否完全一致.
hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bloodish 的回复:]
以前碰到过类似的问题,请尝试byte[] 转Stream之前,对byte[]处理一下

C# code

private byte[] GetUTF8ByteArray(byte[] src)
{
UTF8Encoding encoding = new UTF8Encoding();
string utf……
[/Quote]
处理完byte[]之后,我用Stream streamFile=new MemoryStream(byte[])转换成stream,再把stream做为参数传给SharpZipLib的UnZip方法,结果会抛出一个异常如下:
ICSharpCode.SharpZipLib.SharpZipBaseException: Illegal rep dist code
在 ICSharpCode.SharpZipLib.Zip.Compression.Inflater.DecodeHuffman()
在 ICSharpCode.SharpZipLib.Zip.Compression.Inflater.Decode()
在 ICSharpCode.SharpZipLib.Zip.Compression.Inflater.Inflate(Byte[] buf, Int32 offset, Int32 len)
在 ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream.Read(Byte[] b, Int32 off, Int32 len)
bloodish 2010-09-17
  • 打赏
  • 举报
回复
以前碰到过类似的问题,请尝试byte[] 转Stream之前,对byte[]处理一下

private byte[] GetUTF8ByteArray(byte[] src)
{
UTF8Encoding encoding = new UTF8Encoding();
string utf8String = encoding.GetString(src, 0, src.Length);
utf8String = utf8String.Replace("\r", string.Empty).Replace("\n", string.Empty);
return encoding.GetBytes(utf8String);
}

hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
我用beyond compare比较了一下两个文本,发现解压后读取的文本是有一小部分乱码。请问大侠们怎么解决啊?急啊,解决不了明天就得加班……
hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
System.Xml.XmlException: 名称不能以“0”字符(十六进制值 0x30)开头。
提示这个错误。我对比了一下,基本是一样的,拷到word里面统计字符,不是完全一样,但是文本实在是很大接近1M了,字符统计也就差几个。转换过程中会出现编码问题吗?
javabegin 2010-09-17
  • 打赏
  • 举报
回复
xml格式有问题,建议把原始xml转化成string,然后把下载的xml转化string,看看2个string是否内容一致。
捷哥1999 2010-09-17
  • 打赏
  • 举报
回复
你压缩前的xml内容与压缩后的xml内容没有区别吗?

如果有区别,有哪些不同?
hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
再顶一下
hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
代码没贴全,看这个吧

ZipInputStream s = null;
ZipEntry theEntry = null;
StringBuilder strBld = new StringBuilder();
try
{
s = new ZipInputStream(streamfile);
while ((theEntry = s.GetNextEntry()) != null)
{
if (Path.GetFileName(theEntry.Name) != String.Empty)
{
int size = 10048576;
byte[] data = new byte[10048576];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
strBld.Append(Encoding.Default.GetString(data, 0, size));
}
else
{
break;
}
}
}

}
hanshuai888 2010-09-17
  • 打赏
  • 举报
回复
还是自己把问题解决了。解决方法是改动SharpZipLib中的UnZipLib方法中的一段
int size = 10048576;
byte[] data = new byte[10048576];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
strBld.Append(Encoding.Default.GetString(data, 0, size));
}
else
{
break;
}
}

把size从原来的2048改大了一些。请问一下这个size的大小和什么有关,为什么改了这个就可以了呢?
hanshuai888 2010-09-16
  • 打赏
  • 举报
回复
原本的xml中可能会有些特殊字符,但是程序直接读这个xml没问题。如果把xml压缩后放到一个url中下载下来再读取,按照我之前说的做法,最后转换成string没问题,可是string再转成xml就出错了。难道是下载、解压缩、转换的过程中特殊字符会产生偏差?
wuyq11 2010-09-16
  • 打赏
  • 举报
回复
检查XML格式
gnefuil 2010-09-16
  • 打赏
  • 举报
回复
是不是有特殊字符之类的,比如"<" ">"?

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧