需求: 现在能找到的例子工程, 大部分都是xerces-c2.x实现的, 有很多这样的实际工程,而xerces-c3.x的性能更好。
为了升级xerces-c2.x到xerces-c3.x, 或从xerces-c2.x工程上按需抽取功能到xerces-c3.x, 遇到的问题就是 xerces-c2.x的源工程在xerces-c3.x上编译不过.
解决方法:
我实验着升级了2个xerces-c2.x的工程到xerces-c3.x, 已经成功. 找到些区别.
我的应用是Xml读写, 只要能完成这两个基本的操作.
发现编译不过的原因是 DOMWRITER在3.x中不存在, 替换成了类似功能的DOMLSSerializer. 我试着改了一下, 代码改动量很小. 编译后功能正常.
上个工程发现的不同点和这个类似, 等以后遇到时再补充.
<! INTERNAL_DOMWRITER* theSerializer = GetDOMImplementation()->createDOMWriter(); !> //DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); !> //INTERNAL_DOMWRITER* theSerializer = GetDOMImplementation()->createDOMWriter(); !> XERCES_CPP_NAMESPACE_QUALIFIER DOMLSSerializer * theSerializer = ((XERCES_CPP_NAMESPACE_QUALIFIER DOMImplementationLS*)GetDOMImplementation())->createLSSerializer();
<! const TCHAR* buf = theSerializer->writeToString((INTERNAL_NODE&)*xmlDoc); !> //const TCHAR* buf = theSerializer->writeToString((INTERNAL_NODE&)*xmlDoc); !> const TCHAR* buf = theSerializer->writeToString((XERCES_CPP_NAMESPACE_QUALIFIER DOMNode*)doc->getDocumentElement()); !>
现在网上出了xerces-c3.1.1自带的demo, 还没看到看到有放出的demo. 莫非我要先放出一个xerces-3.1.1的Demo~
也许codeproject上的工程师,认为大家都应该都应该举一反三的~
当工程为多字节字符集时, 字串转换
/** * XMLCh * 和 PCHAR 的转换 */ #define XC(str) XMLString::transcode(str) #define CX(str) XMLString::transcode(str, XMLPlatformUtils::fgMemoryManager)
工程已经完成, 我修改了codeproject上的一个工程.
http://download.csdn.net/source/2943125
XMLEditor修改版_V2010_1228_0117
软件说明:
<2010_1228_0108><home><LostSpeed><XMLEditorM>
功能:
XML文件编辑器, 节点的增删改.对XML所有的操作都包含了. 可以派生出我们自己的很多实际应用.
备注:
这个例子原版是基于xercesc2.x, 在xercesc3.x下编译不过.
原来是Unicode版本, 现在改成多字节版本.
附带的xerces-c_3_1.dll, 也编译成了多字节版本. xerces-c_3_1_1本身的工程,我没加入到此工程, 太大了.
工程中带的是xerces-c_3.1.1的.lib, .Dll, *.hpp
在网上截至到2010_1228_0108, 我还没有找到基于xerces-c_3.1.1的工程Demo. 不知道我是不是第一个放出此Demo的第一个Coder啊~
没往CodeProject上放, 想联系一下作者本人, 让他升级他的Demo到xerces-c_3.1.1.
这个Demo中的XML操作是非常全的, 以后,我就从这个Demo中提炼和封装XML的操作.
<2011_0126>
作者本人不升级, 他认为他的demo, 是为了展现用设计模式开发一个通用的xmlParser.
我根据工程中的应用,封了几个函数,可以方便的取节点的文本内容和节点的属性值.
现在从文件装入xml内容是正常的.
现在正在解决由内存装入xmlBuffer的问题, 同事是用2.x实现的, 在3.1.1上编译不过.
3.1.1中带的例子MemParse, 演示了用分析由内存装入的XmlBuffer. 把需要的功能扒出来, 就可以解决分析xml字符流的问题.
<2011_0127>
今天验证了vc6不能使用xerces-c-3.1.1的原因.即使在vs2008中编译xerces-c-3.1.1时, 使用了/Zc:wchar_t-. 所产生的Dll, 也不能被vc6编译. 而vs2008可以编进vs2008产生的Dll.
vs2008: Treat wchar_t as Built-in Type: No (/Zc:wchar_t-)
vc6: 没有此选项, 不能使用xerces-c-3.1.1和新版boost库的原因也在此
vc6做正式工程的开发工具, 真是不中用了...
现在解决问题的方法有2种:
1. 升级现有的vc6工程到vs2008(为什么不升级到vs2010呢?因为手头现有的免费界面库只支持到vs2008~).
2. 使用旧版xerces-c2.x库.
同事倾向于用方法2, 保险系数高, 节约时间.
等年后准备使用新版boost库时, 得用vs2008了, 那个用vc6做的原始工程代码量不大, 没有同事提供的接口. 升级相对容易.