转载:Xerces C++ 学习笔记

转载自:http://www.cppblog.com/true/archive/2007/03/15/19900.aspx

Xerces C++ 学习笔记

1.   初始化平台:

XMLPlatformUtils::Initialze()

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.   如何遍历文档的结构

遍历一个树型的文档结构有三种方法。

1 .使用 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 节点的内容给打印出来。

2 .使用 DOMTreeWalker

D OMTreeWalker *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);   

}

3 .使用子节点直接遍历树型结构

   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 文件分析前,有两种加载方式:一种直接通过文件加载,一种是通过内存加载

1.   String xmlfile = “a.xml”;

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

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

 

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      我们也可以通过 DOMImplementationLs , DOMImplementation 前者是后者的基类。通过这个类我们可以创建 DOMBuilder parser )或 DOMWriter (序列,既可以写到屏幕,也可以写到文件)

posted on 2007-03-15 15:54 true 阅读(133) 评论(0)   编辑  收藏 引用 所属分类: 其它开源库
<script type="text/javascript"> // </script> <script type="text/javascript"> function pageLoad() { Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest); //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest); } function handleInitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); var eid = args.get_postBackElement().id; if (eid.indexOf("DeleteLink")>0) { args.get_postBackElement().innerHTML = " 正在删除..."; } if (eid.indexOf("btnSubmit")>0) { document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交..."; document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true; } } function TempSave(ElementID) { try { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } catch(ex) { } } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </script>
   
标题
姓名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值