MSXML load失败,原因是有特殊字符!如何处理?

SkinBeauty 2011-06-20 12:59:14

用MSXML的COM载入和存储数据元素,发现一个问题...(Bug???)

xml元素数据中如果有特殊字符,调用save可以,再load这个保存了的文件就会失败, 问如何令它不失败?

如果我每个item都要检测字符串的有效性,才保存,那效率就太低了.

可能是encoding问题,但是我无论保存文档的时候换其它编码让它保存都会出错,怎么回事?


...
m_xml.Invoke1(L"Save", &CComVariant(file_path));
...

CComVariant cVt;
if( m_xml.Invoke1(L"load", &CComVariant(file_path), &cVt) >= 0 &&
cVt.boolVal == VARIANT_TRUE)
{
//OK
}

...



<?xml version='1.0' encoding='utf-8' ?>
<?xml version='1.0' encoding='utf-16' ?>
<?xml version='1.0' encoding='GB2312' ?>
<?xml version='1.0' ?>


<rootlist version="2.0.20">
<list title="abc">
<item desc="Rޘ" filename="help.txt"/>
</list>
</rootlist>



上面xml第一行没有都出现,只是几种情况都试写而已,就是desc="Rޘ" 这个字符串替换成其它可以看到的都可以.

用的是MSXML的COM的load,和save.
...全文
285 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SkinBeauty 2011-06-20
  • 打赏
  • 举报
回复
我查了下,除了关键字符外,还有一些字符是不能使用的,估计没有什么更好的办法,:

\\x00-\\x08
\\x0b-\\x0c
\\x0e-\\x1f


就是每条数据都要做个filter过滤替换掉它所谓的非法字符(如果不是可编辑和跟其它做配置接口打交道,感觉没什么优势)
看来XML这类东西只适合低性能需求的实现,每个都转换,效率太低,数据如果很多行就慢了.加上我的水平又不行,代码效率又低, 还是自己写个文件结构输入输出,这个东西弄出来..

对XML方案不满意结贴,呵呵...谢谢大家帮忙!!!!!!!!!!!!!!!

ToperRay 2011-06-20
  • 打赏
  • 举报
回复

这样做应该就没问题了。


<?xml version='1.0' encoding='utf-16' ?>
<rootlist version="2.0.20">
<list title="abc">
<item desc="R̞" filename="help.txt"/>
</list>
</rootlist>


你需要用字符实体来做。
kyotrue 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 skinbeauty 的回复:]
你是说xml的save和load的数据就是hex二进制文件?而不是编辑可视类型的普通xml按照某种编码方式的文本?

如果没理解错的话,这样我还要读入后,还要对某个元素信息再转换成文本?

如 desc="Rޘ" -> desc="0x06523F",这样的话不便于编辑和流览,更重要是我还要每条都转换????

还是xml的load和save就可以指定它以二进制输出?(这样话好像很好……
[/Quote]

HEX转换只能你自己来了,也不难啊,每个BYTE都%02X格式化就行了。
你都二进制数据了,哪儿还谈得上直接浏览的问题啊,HEX转换就是为了让你的文本中只有ASCII字符。

还有,不能
<?xml version='1.0' encoding='utf-8' ?>
<?xml version='1.0' encoding='utf-16' ?>
<?xml version='1.0' encoding='GB2312' ?>
定义这么多种编码,只能定义一种,解释器需要编码信息对非ASCII字符进行转换的
pj220 2011-06-20
  • 打赏
  • 举报
回复
反正你的二进制数据也不能用浏览的方式编辑,你还不如在设计XML文件格式的时候,给所有的二进制数据都给出一个文件链接的属性,属性里指明这些二进制数据在另外一个数据文件里,在这个数据文件里你可以随便写二进制数据。
SkinBeauty 2011-06-20
  • 打赏
  • 举报
回复
你是说xml的save和load的数据就是hex二进制文件?而不是编辑可视类型的普通xml按照某种编码方式的文本?

如果没理解错的话,这样我还要读入后,还要对某个元素信息再转换成文本?

如 desc="Rޘ" -> desc="0x06523F",这样的话不便于编辑和流览,更重要是我还要每条都转换????

还是xml的load和save就可以指定它以二进制输出?(这样话好像很好见)
kyotrue 2011-06-20
  • 打赏
  • 举报
回复
XML是文档序列化格式,不是用来存储二进制数据的。比如你存“>”“<”这些XML的关键字,肯定会造成无法解读的。

如果上层传下来的不一定是可读字符,那就应该统一用HEX表示,而不是去判断什么特殊字符。
SkinBeauty 2011-06-20
  • 打赏
  • 举报
回复
不能避免,这个是提供给上层应用的,他们给什么就应该存什么,不过是可以过滤,但是一次是批量的,每条过滤,感觉不太好...特殊子符应该是一个集合,所以觉得这样处理不是法子,应该是不是怎么设置,让它写进去后可以读,写也是接口写的,读也是,我只是参数给个路径.(当然XML节点的创建内容它是可以的,写入也没问题,就是读有问题..
kyotrue 2011-06-20
  • 打赏
  • 举报
回复
不能避免使用特殊字符么?如果非要存二进制数据,也可以用HEX来表示啊,3E4FB1这样的
XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的:   第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会;   第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。   本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta数据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。 这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml中,不需要任何改变。 (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML中随处可见: 1. sample 2.sample 3.sample 4.samplar 在XML文档中,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML中正确的写法是 1. sample 2.sample 3.sample 4.samplar   另外,XML标记必须遵循下面的命名规则: 1.名字中可以包含字母、数字以及其它字母; 2.名字不能以数字或"_" (下划线) 开头; 3.名字不能以字母 xml (或 XML 或 Xml ..) 开头; 4.名字中不能包含空格。 在XML文档中任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: XML轻松学习手册 ajie
#include "stdafx.h" #import "msxml4.dll" using namespace MSXML2; #import "C:/Program Files/Common Files/MSSoap/Binaries/mssoap30.dll" \ exclude("IStream", "IErrorInfo", "ISequentialStream", \ "_LARGE_INTEGER", "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME") using namespace MSSOAPLib30; //你机器得安装SOAP Toolkit3.0 ,1.0时,用using namespace时报错 void query(char *EndPointURL,char *NameSpace,char *method,int argv_len,char* args[],char* argv[]) { ISoapSerializerPtr Serializer; ISoapReaderPtr Reader; ISoapConnectorPtr Connector; // Connect to the service Connector.CreateInstance(__uuidof(HttpConnector30)); Connector->Property["EndPointURL"] = EndPointURL;//"http://localhost/WebService1/Service1.asmx"; Connector->Connect();//和服务器连接 // Begin message Connector->Property["SoapAction"] = _bstr_t(NameSpace) + _bstr_t(method);//"http://xin.org/getIP"; Connector->BeginMessage(); Serializer.CreateInstance(__uuidof(SoapSerializer30)); // 将serializer连接到connector的输入字符串 Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); // 创建SOAP消息 Serializer->StartEnvelope("","",""); Serializer->StartBody(""); Serializer->StartElement(method,NameSpace,"","");//命名空间必须有 for(int i=0;i<argv_len;i++) { Serializer->StartElement(args[i],NameSpace,"",""); Serializer->WriteString(argv[i]); Serializer->EndElement(); } Serializer->EndElement(); Serializer->EndBody(); Serializer->EndEnvelope(); // Send the message to the web service Connector->EndMessage(); // 读取响应 Reader.CreateInstance(__uuidof(SoapReader30)); // 将reader联接到connector的输出字符串 Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ""); printf("Answer: %s\n",(const char*) Reader->RpcResult->text); } int main(int argc, char* argv[]) { CoInitialize(NULL); char *EndPointURL="http://approve.share-su

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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