Xerces-c-src_2_8 安装&开发文档

 

 

一、           安装

下载

 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

   设置包含源代码的环境变量:

                 exportXERCESCROOT=/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

                 makeinstall     

   (编译可能要花费你好一会儿,在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 = newXercesDOMParser();

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);

for (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.      Stringxmlfile = “a.xml”;

Parser->parse(xmlfile.c_str());

E.      MemBufInputSource  

这个类处理内存的数据,然后利用 parser->parse(*men)//men 是MemBufInputSource   的实例指针对象。

例子代码:

MemBufInputSource* pInputSource = newMemBufInputSource((XMLByte *)srcBytes.c_str(), srcBytes.size(),X("GUID"));

 

bool errorsOccured = false;

10 在加载分析报文前,可以设置XercesDOMParser 的一些属性。

        Parser->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



更多内容请访问:http://bdtool.net/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值