• 全部
...

XmlDocument.LoadXML时出错。

gcq 2008-09-05 10:03:13
用XmlDocument对象Load以下XML的时候,
<?xml version="1.0"?>
<root>
<test value=""/>
</root>


提示以下错误:
“ ”(十六进制值 0x05)是无效的字符。 行 3,位置 14。

经过测试,是""字符出现的错误。
但是,该XML用IE却能正确打开。

请教各位,问题原因是什么?如何解决?
谢谢!
...全文
给本帖投票
2192 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinsword 2008-09-27
  • 打赏
  • 举报
回复
有个笨方法,
xml中
0x00至0x08
0x0b至0x0c
0x0e至0x1f
都是无效字符串

定义一个常量
先用
string xml= File.ReadAllText("aa.xml",Encoding.UTF8);
的方法载入

把字符串xml中的每个无效字符替换成自己的一个标记字符串
比如把,0x00 替换成 "{$fixchar:0$}"
把,0x01 替换成 "{$fixchar:1$}"

现在用 xmlDocument.LoadXml(xml),就不会出错了

读完节点内容后,在把得到的节点内容反过来过滤一下 例如把"{$fixchar:0$}" 过滤成0x00 ....
具体的代码不写了
还好无效字符不多



gcq 2008-09-11
  • 打赏
  • 举报
回复
谢谢各位支持以及帮助。结贴。
gcq 2008-09-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 danjiewu 的回复:]
确实存在你所说的问题,并不是我所说的原因,网上查了一下[#x0-#x8] | #xB | #xC | [#xE-#x1F] | [#xD800-#xDFFF] | #xFFFE | #xFFFF是xml的非法字符。
问题的原因是生成xml的程序不正确,很可能是自己拼字符串得到的xml。如果在程序中通过XmlTextWriter或者XmlDocument生成的话应该是
<?xml version="1.0"?>
<root>
<test value="" />
</root>
至于IE为什么能显式,可能是因为IE只是把Xml当作文本显示,不是标准的Xml解析程序吧。
[/Quote]

谢谢!明白了。
其实“”(十六进制值 0x05)我也确认过了,原始文字是字符串"\\\\005"。
可能在XML转换过程中,用字符串处理的时候,变成字符"\005"从而导致字符串错误。

可是,XML是通过别的工具生成的,看来只能替换了。

danjiewu 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 gcq 的回复:]
引用 18 楼 danjiewu 的回复:
Xml实际是用什么编码保存的和Xml里的encoding声明不是一回事,如果不一致就会出现这样的错误。
你在读取Xml内容时要指定编码格式,比如
string xml= File.ReadAllText("aa.xml",Encoding.UTF8);
XmlDocument.Load("aa.xml",Encoding.UTF8);


谢谢!
问题中示范XML原文(请拷贝)不知道你是否可以用XmlDocument(或者XmlReader)打开?
[/Quote]

确实存在你所说的问题,并不是我所说的原因,网上查了一下[#x0-#x8] | #xB | #xC | [#xE-#x1F] | [#xD800-#xDFFF] | #xFFFE | #xFFFF是xml的非法字符。
问题的原因是生成xml的程序不正确,很可能是自己拼字符串得到的xml。如果在程序中通过XmlTextWriter或者XmlDocument生成的话应该是
<?xml version="1.0"?>
<root>
<test value="" />
</root>
至于IE为什么能显式,可能是因为IE只是把Xml当作文本显示,不是标准的Xml解析程序吧。
newtypebao 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzyhuian06142 的回复:]
那就写个方法自动的去转全角和半角了
在KeyPress里面
public char FullCodeToHalfCode(char c)
{
//得到c的编码
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(c.ToString());

int H = Convert.ToInt32(bytes[1]);
int L = Convert.ToInt32(bytes[0]);

//得到unicode编码
int value = H * 256 + L;

//是全角
if …
[/Quote]


强人....自动的去转全角和半角...
gcq 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 LQknife 的回复:]
你先把这个xml当成普通的文件来读到字符串
然后修改这个字符串成符合xml标准,最后
dOC.LoadXml(STR);
[/Quote]

现在关键是为什么IE可以打开问题中的XML,而XMLDocument对象(包括XMLReader)却不行。

除了替换出问题的字符以外,没有其他办法了吗?
gcq 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 danjiewu 的回复:]
Xml实际是用什么编码保存的和Xml里的encoding声明不是一回事,如果不一致就会出现这样的错误。
你在读取Xml内容时要指定编码格式,比如
string xml= File.ReadAllText("aa.xml",Encoding.UTF8);
XmlDocument.Load("aa.xml",Encoding.UTF8);
[/Quote]

谢谢!
问题中示范XML原文(请拷贝)不知道你是否可以用XmlDocument(或者XmlReader)打开?
CCjian 2008-09-09
  • 打赏
  • 举报
回复
LS 有理,
学习
danjiewu 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 gcq 的回复:]
引用 15 楼 danjiewu 的回复:
你的XML是怎么得到的?首先要确定Xml是按什么编码保存的。
IE能显示是因为IE默认的编码和程序不一样,你在Load的时候指定编码格式试试。utf-8或者utf-16(unicode),应该是两者之一。


XML是另外一个工具得到的。
但是问题中的""是十六进制值 0x05,在IE中可以正常打开显示,XmlDocument(或者XmlReader)打开却出错。 encoding=utf-16也出错
[/Quote]

Xml实际是用什么编码保存的和Xml里的encoding声明不是一回事,如果不一致就会出现这样的错误。
你在读取Xml内容时要指定编码格式,比如
string xml= File.ReadAllText("aa.xml",Encoding.UTF8);
XmlDocument.Load("aa.xml",Encoding.UTF8);
gcq 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 danjiewu 的回复:]
你的XML是怎么得到的?首先要确定Xml是按什么编码保存的。
IE能显示是因为IE默认的编码和程序不一样,你在Load的时候指定编码格式试试。utf-8或者utf-16(unicode),应该是两者之一。
[/Quote]

XML是另外一个工具得到的。
但是问题中的""是十六进制值 0x05,在IE中可以正常打开显示,XmlDocument(或者XmlReader)打开却出错。 encoding=utf-16也出错
danjiewu 2008-09-09
  • 打赏
  • 举报
回复
哦,你是用LoadXml的,那你在得到string的时候需要制定编码为utf-8
danjiewu 2008-09-09
  • 打赏
  • 举报
回复
你的XML是怎么得到的?首先要确定Xml是按什么编码保存的。
IE能显示是因为IE默认的编码和程序不一样,你在Load的时候指定编码格式试试。utf-8或者utf-16(unicode),应该是两者之一。
LQknife 2008-09-08
  • 打赏
  • 举报
回复
你先把这个xml当成普通的文件来读到字符串
然后修改这个字符串成符合xml标准,最后
dOC.LoadXml(STR);
gcq 2008-09-08
  • 打赏
  • 举报
回复
有同学解决过此类问题吗?
gcq 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lu_huanling 的回复:]
能不能在LOADXML之前把 ¦ 换掉,通过正则.
不改原文件.
但不知道怎么写.呵呵
[/Quote]

谢谢!

你的意思是读到变量里修改后再LOAD?
那分析出来的值不是一样会变的。 :)
lu_huanling 2008-09-05
  • 打赏
  • 举报
回复
能不能在LOADXML之前把 | 换掉,通过正则.
不改原文件.
但不知道怎么写.呵呵
gcq 2008-09-05
  • 打赏
  • 举报
回复
谢谢 zzyhuian06142 。

这样可行,但是改变原有的值了。

有没有其他方法在不改变值的前提下正常LOADXML呢?
比如,IE就可以正常打开问题中的XML。
zzyhuian06142 2008-09-05
  • 打赏
  • 举报
回复
那就写个方法自动的去转全角和半角了
在KeyPress里面
public char FullCodeToHalfCode(char c)
{
//得到c的编码
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(c.ToString());

int H = Convert.ToInt32(bytes[1]);
int L = Convert.ToInt32(bytes[0]);

//得到unicode编码
int value = H * 256 + L;

//是全角
if (value >= 65281 && value <= 65374)
{
int halfvalue = value - 65248;//65248是全半角间的差值。
byte halfL = Convert.ToByte(halfvalue);

bytes[0] = halfL;
bytes[1] = 0;
}
else if (value == 12288)
{
int halfvalue = 32;
byte halfL = Convert.ToByte(halfvalue);

bytes[0] = halfL;
bytes[1] = 0;
}
else
{
return c;
}

//将bytes转换成字符
string ret = System.Text.Encoding.Unicode.GetString(bytes);

return Convert.ToChar(ret);
}
gcq 2008-09-05
  • 打赏
  • 举报
回复
谢谢楼上各位的帮助。

是""字符(不是正常打出的“|”)出现的问题。

而类似这种全角字符有很多,除了逐个替换以外,如何能在保证XML内容不改变的前提下,正确Load这样的XML?
zzyhuian06142 2008-09-05
  • 打赏
  • 举报
回复
tringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\"?> ");
sb.Append("<root> ");
sb.Append("<test value=\"| \"/> ");
sb.Append("</root> ");
XmlDocument d = new XmlDocument();
try
{
d.LoadXml(sb.ToString());
XmlNode node = d.SelectSingleNode("/root/test");
MessageBox.Show(node.Attributes["value"].Value.ToString());
MessageBox.Show("OK");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
d = null;
sb = null;
}
测试输出的也都正常的
加载更多回复(4)

111,095

社区成员

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

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部