Xerces-c-src_2_8 安装&开发文档
10 在加载分析报文前,可以设置 XercesDOMParser 的一些属性。
一、 安装
下载
windows、linux、cygwin, 以及solaris等系统平台。在这里,我选用的是Redhat Enterprise Linux AS3,选用的Xerces-C++ 是xerces-c-src_2_8_0.tar.gz,可以从官方网站:http://www.apache.org/ 直接下载。
编译源码库
由于下载下来的是源码,所以需要对其进行编译,否则我们无法加载库文件。
首先进入你的工作目录:cd /home/soft/
然后解压你的源码包: tar zxvf xerces-c-src_2_8_0.tar.gz
设置包含源代码的环境变量:
export XERCESCROOT=/home/soft/xerces-c-src_2_8_0
进入目录:cd xerces-c-src_2_8_0/src/xercesc
运行脚本生成makefile文件:
./runConfigure -plinux -cgcc -xg++ -C--prefix=/opt/ApacheXML
选项: -p 为操作系统平台
-c C 编译器
-x C++编译器
-c 库的配置路径
编译源码:make
make install
(编译可能要花费你好一会儿,在41机器上花费大约2分钟的时间,所以要耐心等候)
二、 实际开发指南
1 初始化平台:
XMLPlatformUtils::Initialze()
例子代码:
Try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
std::cout << "Error during initialization! :/n"
<< message << "/n";
XMLString::release(&message);
return false;
}
2 销毁平台:
XMLPlatformUtils::Terminate();
3 加载分析报文
XercesDOMParser *parser = new XercesDOMParser();
Parser->parse( 参数 ); 这个参数可以直接是文件名,也可以是内存的数据,具体的查看 API
4 数据格式转换
XMLString.transcode() 这个方法有多个重载,既可以把 XMLCh * 格式的数据转换成 char * 的数据,也可以把 char * 的数据转换成 XMLCh *, 我们也可以利用这个函数来初始化 XMLCh 格式类型的数组,比如 XMLCh temp[100];
XMLString.transcode(“LS”,temp,99);// 用“ LS ”初始化 temp 这个数组的内容。
5 分析报文后,如何得到文档的树型结构
DOMDocument *xmlDoc = parser->getDocument();
6 得到树型结构后,如何得到第一个根节点
DOMElement *root = xmlDoc->getDocumentElement();
7 如何遍历文档的结构
遍历一个树型的文档结构有三种方法。
A. 使用 DOMNodeIterator 类
DOMNodeIterator *iterator = xmlDoc->createNodeIterator(root, DOMNodeFilter::SHOW_TEXT, NULL, true);
for ( DOMNode * current = (DOMNode *)iterator->nextNode(); current != 0; current = (DOMNode *)iterator->nextNode() )
{
string strValue = XMLString::transcode(current->getNodeValue());
std::cout <<strValue<<endl;
}// 以上就可以把 xml 文档中的属性为 NODETEXT 节点的内容给打印出来。
B. 使用 DOMTreeWalker 类
DOMTreeWalker *walker = xmlDoc->createTreeWalker(root, DOMNodeFilter::SHOW_TEXT, NULL, true);
f or (DOMNode *current = walker->nextNode(); current != 0; current = walker->nextNode() )
{
char *strValue = XMLString::transcode( current->getNodeValue() ); std::cout <<strValue;
XMLString::release(&strValue);
}
C. 使用子节点直接遍历树型结构
DOMNode *n = (DOMNode*)xmlDoc->getDocumentElement();
// 下面开始遍历这个树的结构
if(n)
{
if (n->getNodeType() == DOMNode::ELEMENT_NODE)
{
DOMNodeList* nodeList = n->getChildNodes();
unsigned int nListLen = nodeList->getLength();
for (unsigned int i=0; i<nListLen; ++i)
{
DOMNode* nodeTemp = nodeList->item(i);
if (nodeTemp->getNodeType() == DOMNode::ELEMENT_NODE)
{
for (DOMNode* node1=nodeTemp->getFirstChild(); node1!=0; node1=node1->getNextSibling())
{
char* name = XMLString::transcode(node1->getNodeName());
string strTemp = name;
if (strTemp == "name") // 这个就是跟 xml 文档中 name 节点匹配
{
char* myname=XMLString::transcode(node1->getFirstChild()->getNodeValue());
cout<<myname<<endl;
}
}
}
continue;
}
}
}
8 如何添加子节点。
//Add new (empty) Element to the root element
DOM_Element parentNode = …;// parent is known
DOM_Element prodElem = doc->createElement (tagName);
parentNode->appendChild (prodElem);
9 加载方式
在加载 xml 文件分析前,有两种加载方式:一种直接通过文件加载,一种是通过内存加载
D. String xmlfile = “a.xml”;
Parser->parse(xmlfile.c_str());
E. MemBufInputSource
这个类处理内存的数据,然后利用 parser->parse(*men)//men 是 MemBufInputSource 的实例指针对象。
例子代码:
MemBufInputSource* pInputSource = new MemBufInputSource((XMLByte *)srcBytes.c_str(), srcBytes.size(), X("GUID"));
bool errorsOccured = false;
10 在加载分析报文前,可以设置 XercesDOMParser 的一些属性。
P arser->setValidationScheme( XercesDOMParser::Val_Auto );
Parser->setDoNamespaces( false );
Parser->setDoSchema( false );
Parser->setLoadExternalDTD( false );
// 这个部分的代码可以参照类库自带的例子。
11 我们也可以设置错误的处理代码。
这部分可以查看类库下的 DOMPrint 例子。 DOMError ,DOMErrorHandler
12 也可以设置分析过滤的属性
DOMNodeFilter 这个类能起到这个效果
13 要美化文档的格式化输出,我们可以使用
XMLFormatter XMLFormatTarget , 用的时候可以查看。
14 xml输出
我们也可以通过 DOMImplementationLs , DOMImplementation 前者是后者的基类。通过这个类我们可以创建 DOMBuilder ( parser )或 DOMWriter (序列,既可以写到屏幕,也可以写到文件)
15 更多参考资料:
http://xerces.apache.org/xerces-c/apiDocs/index.html
http://www.ibm.com/developerworks/cn/xml/x-xercc2/index.html
http://www.cnblogs.com/lirengang/articles/623863.html
http://www.cppblog.com/true/archive/2007/03/15/19900.html
http://hi.baidu.com/fx0517/blog/item/258f12d53c32c6c451da4bb3.html
http://blog.csdn.net/kybd2006/archive/2007/09/28/1805106.aspx
http://www.ctiforum.com/train/intel/application/application01_013.htm