用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. 

解决方案 »

  1.   

    不能避免使用特殊字符么?如果非要存二进制数据,也可以用HEX来表示啊,3E4FB1这样的
      

  2.   

    不能避免,这个是提供给上层应用的,他们给什么就应该存什么,不过是可以过滤,但是一次是批量的,每条过滤,感觉不太好...特殊子符应该是一个集合,所以觉得这样处理不是法子,应该是不是怎么设置,让它写进去后可以读,写也是接口写的,读也是,我只是参数给个路径.(当然XML节点的创建内容它是可以的,写入也没问题,就是读有问题..
      

  3.   

    XML是文档序列化格式,不是用来存储二进制数据的。比如你存“>”“<”这些XML的关键字,肯定会造成无法解读的。如果上层传下来的不一定是可读字符,那就应该统一用HEX表示,而不是去判断什么特殊字符。
      

  4.   

    你是说xml的save和load的数据就是hex二进制文件?而不是编辑可视类型的普通xml按照某种编码方式的文本?如果没理解错的话,这样我还要读入后,还要对某个元素信息再转换成文本?如 desc="Rޘ"  ->  desc="0x06523F",这样的话不便于编辑和流览,更重要是我还要每条都转换????还是xml的load和save就可以指定它以二进制输出?(这样话好像很好见)
      

  5.   

    反正你的二进制数据也不能用浏览的方式编辑,你还不如在设计XML文件格式的时候,给所有的二进制数据都给出一个文件链接的属性,属性里指明这些二进制数据在另外一个数据文件里,在这个数据文件里你可以随便写二进制数据。
      

  6.   


    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字符进行转换的
      

  7.   


    这样做应该就没问题了。
    <?xml version='1.0' encoding='utf-16' ?>
    <rootlist version="2.0.20">
        <list title="abc">
            <item desc="R&#0798;" filename="help.txt"/>
        </list>
    </rootlist>
    你需要用字符实体来做。
      

  8.   

    我查了下,除了关键字符外,还有一些字符是不能使用的,估计没有什么更好的办法,:\\x00-\\x08
    \\x0b-\\x0c
    \\x0e-\\x1f
    就是每条数据都要做个filter过滤替换掉它所谓的非法字符(如果不是可编辑和跟其它做配置接口打交道,感觉没什么优势)
    看来XML这类东西只适合低性能需求的实现,每个都转换,效率太低,数据如果很多行就慢了.加上我的水平又不行,代码效率又低, 还是自己写个文件结构输入输出,这个东西弄出来..对XML方案不满意结贴,呵呵...谢谢大家帮忙!!!!!!!!!!!!!!!